4

我有 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}”之一。

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=""。有没有办法在不使用“无命名空间”的情况下使验证成功?究竟是什么导致第一个 XML 失败?

4

1 回答 1

4

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

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

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

W3C 推荐中的更多信息http://www.w3.org/TR/xmlschema-0/#re​​f50

于 2013-02-19T22:23:14.100 回答