2013-12-09 42 views
0

我有兩個有效的XSD文件(a.xsd和b.xsd)。我嘗試根據Schema驗證XML文件(example.xml)並獲取錯誤。XSD XML - 使用限制時的驗證錯誤

有人可以向我解釋,爲什麼我得到一個驗證錯誤?

THX


a.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://namespace/a" xmlns:a="http://namespace/a" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="A"> 
    <xs:sequence> 
     <xs:element name="E1" type="xs:token" form="unqualified"/> 
     <xs:element name="E2" type="xs:token" form="unqualified" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

b.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://namespace/b" xmlns:b="http://namespace/b" xmlns:a="http://namespace/a" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:import namespace="http://namespace/a" schemaLocation="a.xsd"/> 
    <xs:element name="START" type="b:B"/> 
    <xs:complexType name="B"> 
    <xs:complexContent> 
     <xs:restriction base="a:A"> 
     <xs:sequence> 
      <xs:element name="E1"> 
      <xs:simpleType> 
       <xs:restriction base="xs:token"> 
       <xs:enumeration value="value1"> 
        <xs:annotation> 
        <xs:appinfo> 
         <codeName>value1</codeName> 
        </xs:appinfo> 
        </xs:annotation> 
       </xs:enumeration> 
       <xs:enumeration value="value2"> 
        <xs:annotation> 
        <xs:appinfo> 
         <codeName>value2</codeName> 
        </xs:appinfo> 
        </xs:annotation> 
       </xs:enumeration> 
       <xs:enumeration value="value3"> 
        <xs:annotation> 
        <xs:appinfo> 
         <codeName>value3</codeName> 
        </xs:appinfo> 
        </xs:annotation> 
       </xs:enumeration> 
       </xs:restriction> 
      </xs:simpleType> 
      </xs:element> 
     </xs:sequence> 
     </xs:restriction> 
    </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

的example.xml

<?xml version="1.0" encoding="UTF-8"?> 
<b:START xmlns="http://namespace/a" xmlns:b="http://namespace/b" xsi:schemaLocation="http://namespace/b C:\problem\b.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <E1>value1</E1> 
</b:START> 
+0

我也想用這個XSD通過JAXB(unmarshal&marshal)生成Java類。如果從Petru獲得空白名稱空間的解決方案,則來自E1的內容不會映射到Java類中,因爲來自a.xsd的定義是,E1屬於名稱空間http:// namespace/a ... – user3083431

回答

2

這是xmlns="http://namespace/a"在示例XML會拋出你的XML斷聲明......這是因爲你的a.xsd使用form="unqualified"/屬性來定義E1和E2。

這個屬性的影響是它拒絕你的元素的命名空間,也就是說這些元素必須沒有命名空間 - 它們沒有限定。

要解決你的XML,你有兩個選擇,根據您的樣品:

<?xml version="1.0" encoding="UTF-8"?> 
<b:START xmlns:b="http://namespace/b" xsi:schemaLocation="http://namespace/b b.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <E1>value1</E1> 
</b:START> 

或其他附加的xmlns = 「」 你的E1元素:

從根元素中取出xmlns="http://namespace/a"

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) --> 
<START xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://namespace/a" xmlns="http://namespace/b"> 
    <E1 xmlns="">value1</E1> 
</START> 

可能還有其他變體,但最終,上述內容對於理解如何最終在元素級重寫一個名稱空間(基本上是作用域)至關重要。

+0

+1。 @ user3083431:如果它幫助你,請記住[**接受Petru的答案**](http://meta.stackexchange.com/q/5234/234215)。謝謝。 – kjhughes

+0

好的,理解...下一個問題:XSD中應該改變哪些用於JAXB(元帥/解組)?因爲在生成的類中,E1元素在命名空間''http:// namespace/a''中,那麼驗證錯誤會發生什麼。 – user3083431

+1

@ user3083431,您應該創建一個新問題並標記爲'jaxb'(除了您可能需要的任何其他標記)。不要忘記添加有關JAXB設置的詳細信息,例如版本信息,生成的代碼的相關片段等。 –