使用XSD和xmlns =“”验证XML

时间:2013-02-19 22:06:38

标签: xml xsd xml-namespaces

我有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>

唯一的区别是name元素上的xmlns =“”。有没有办法在不使用“无命名空间”的情况下在第一次验证成功?究竟是什么导致第一个XML失败?

1 个答案:

答案 0 :(得分:3)

您需要将elementFormDefault="qualified"属性添加到架构<xs:schema>元素。

只有全局定义的元素和属性才会自动出现在模式目标命名空间中。在<complexType>定义中定义的元素被称为本地元素。属性elementFormDefault定义本地元素是否应该被限定。对于属性,有attributeFormDefault属性。

这些属性的默认值为unqualified。因此,在您的模式中,元素<name>被认为没有名称空间URI。通常希望所有元素都在目标名称空间中,因此使用elementFormDefault="qualified"属性是一种常见做法。另一方面,属性通常不应该具有命名空间,因此attributeFormDefault经常被省略。

W3C建议书中的更多信息http://www.w3.org/TR/xmlschema-0/#ref50