2013-02-19 100 views
3

我有XML:與XSD和xmlns = 「驗證XML」

<?xml version="1.0" encoding="utf-8"?> 
<song id="id1" 
      xmlns="urn:Test:Song:1.0" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="urn:Test:Song:1.0 song.xsd"> 
    <name>name1</name> 
</song> 

它無法驗證對XSD:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns="urn:Test:Song:1.0" 
       targetNamespace="urn:Test:Song:1.0" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" > 

    <xs:element name="song"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="name" type="xs:string" minOccurs="0" /> 
    </xs:sequence> 
    <xs:attribute name="id" type="xs:string" /> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
在Eclipse和Visual Studio

。在Eclipse中,錯誤是: cvc-complex-type.2.4.a:發現無效內容以元素「name」開頭。預計會有'{name}'之一。

驗證成功的XML:

<?xml version="1.0" encoding="utf-8"?> 
<song id="id1" 
      xmlns="urn:Test:Song:1.0" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="urn:Test:Song:1.0 song.xsd"> 
    <name xmlns="">name1</name> 
</song> 

唯一的區別是XMLNS = 「」 名稱元件上。有沒有一種方法可以在沒有使用「no namespace」的情況下使驗證成功?究竟是什麼導致第一個XML失敗?

回答

3

您需要將elementFormDefault="qualified"屬性添加到您的模式<xs:schema>元素中。

只有全局定義的元素和屬性自動在模式目標名稱空間中。在<complexType>定義中定義的元素被認爲是本地的。屬性elementFormDefault定義本地元素是否應該被限定。對於屬性,有attributeFormDefault屬性。

這些屬性的默認值是unqualified。因此,在您的模式中,元素<name>被認爲沒有名稱空間URI。通常所有元素都需要位於目標名稱空間中,因此使用elementFormDefault="qualified"屬性是常見操作。另一方面,屬性通常不應該有一個命名空間,所以attributeFormDefault通常被省略。

更多信息在W3C推薦http://www.w3.org/TR/xmlschema-0/#ref50