XML验证失败

问题描述:

我有一个简单的XSD使用XmlReaderSettingsXML验证失败

这里通过的XmlSchemaSet对象和XML paresed加载的问题是我的XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="A"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="B"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="C" minOccurs="0" maxOccurs="unbounded"> 
       <xs:complexType mixed="true"> 
        <xs:sequence> 
        <xs:element name="Properties" minOccurs="0"> 
         <xs:complexType> 
         <xs:sequence> 
          <xs:element name="Item" minOccurs="0">        
          </xs:element> 
         </xs:sequence> 
         </xs:complexType> 
        </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

这以下XML将在第5行上生成错误(“无法找到属性'名称'的架构信息。at 5:11行:

<A> 
    <B> 
     <C> 
      <Properties> 
       <Item Name="OBJECT"> 
        <Item Name="CONTENT"/> 
       </Item> 
      </Properties> 
     </C> 
    </B> 
</A> 

我的XSD有什么问题?

+0

https://*.com/questions/5303476/how-to-fix-error-could-not-find-schema-information-for-the-attribute-element – obl

+0

@obi,没有什么在那个Q/A中对于这种情况很有用。 –

您需要定义的模式为Item元素。

你缺少第二级项目的定义和它的属性。

下应该是你的*作品

     <xs:complexType> 
          <xs:sequence> 
          <xs:element name="Item"> 
           <xs:complexType> 
           <xs:attribute name="Name" type="xs:string" use="required" /> 
           </xs:complexType> 
          </xs:element> 
          </xs:sequence> 
          <xs:attribute name="Name" type="xs:string" use="required" /> 
         </xs:complexType> 

所以它看起来像这样

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="A"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="B"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="C" minOccurs="0" maxOccurs="unbounded"> 
       <xs:complexType mixed="true"> 
        <xs:sequence> 
        <xs:element name="Properties" minOccurs="0"> 
         <xs:complexType> 
         <xs:sequence> 
          <xs:element name="Item" minOccurs="0">        
          <xs:complexType> 
           <xs:sequence> 
           <xs:element name="Item"> 
            <xs:complexType> 
            <xs:attribute name="Name" type="xs:string" use="required" /> 
            </xs:complexType> 
           </xs:element> 
           </xs:sequence> 
           <xs:attribute name="Name" type="xs:string" use="required" /> 
          </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
         </xs:complexType> 
        </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

要么,你的第一个项目应自终止,如果你只想要一个水平之下项目。但即便如此,您仍然必须定义属性。

我认为没有什么不妥的XSD,和什么是错的与你的架构处理器。以下是撒克逊报道:

Saxon-EE 9.8.0.3J from Saxonica 
Java version 1.8.0_121 
Using license serial number V005192 
Loading schema document file:/Users/mike/Desktop/temp/test.xsd 
Finished loading schema document file:/Users/mike/Desktop/temp/test.xsd 
Schema checking successful. Time: 738ms. Memory: 37Mb. 
Using parser org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser 
Processing file:/Users/mike/Desktop/temp/test.xml 
Validation time: 244ms. Memory: 40Mb. 
Validation successful 

您的Item元素声明既没有simpleTypecomplexType的孩子,也不是type属性。在XSD部分1的相关规则是在§3.3.2,在那里它说,有效{类型定义}是:

对应于<simpleType><complexType> 元素信息项在[儿童]类型定义,如果有一个存在, 否则类型定义·由·实际值的 类型[属性]·由·实际值解析·到,否则{类型定义}元素 声明·解析·到·的 substitutionGroup [属性],如果存在的话,否则·UR型 定义·。

因此,在这种情况下,它是“·乌尔类型定义·”,这仅仅是xs:anyType一个奇特的名字(见§3.4.7),它允许任何内容。

遗憾的是微软还没有更新其架构处理器大约15年,盲蝽象这样不知道。

这意味着你有3种方式前进:

  • 提交错误微软并等待15年的分辨率

  • 切换到不同架构处理器(例如,撒克逊)周围的错误

  • 工作通过声明的元素Item所需的类型。

+0

谢谢迈克尔的全面解释。我会跳过选项#1 :) – MikyMike