2017-08-10 217 views
0

我有一個簡單的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://stackoverflow.com/questions/5303476/how-to-fix-error-could-not-find-schema-information-for-the-attribute-element – obl

+0

@obi,沒有什麼在那個Q/A中對於這種情況很有用。 –

回答

0

您需要定義的模式爲Item元素。

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: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> 

要麼,你的第一個項目應自終止,如果你只想要一個水平之下項目。但即便如此,您仍然必須定義屬性。

0

我認爲沒有什麼不妥的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