2013-02-19 112 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