我有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失败?
答案 0 :(得分:3)
您需要将elementFormDefault="qualified"
属性添加到架构<xs:schema>
元素。
只有全局定义的元素和属性才会自动出现在模式目标命名空间中。在<complexType>
定义中定义的元素被称为本地元素。属性elementFormDefault
定义本地元素是否应该被限定。对于属性,有attributeFormDefault
属性。
这些属性的默认值为unqualified
。因此,在您的模式中,元素<name>
被认为没有名称空间URI。通常希望所有元素都在目标名称空间中,因此使用elementFormDefault="qualified"
属性是一种常见做法。另一方面,属性通常不应该具有命名空间,因此attributeFormDefault
经常被省略。
W3C建议书中的更多信息http://www.w3.org/TR/xmlschema-0/#ref50