我在一个非常简单的模式上遇到了一些麻烦。在架构指定的 xml 正文中,根元素的第一个子元素被指定为具有 xmlns="",这给我带来了验证问题。
我反复搜索并尝试找出发生这种情况的原因,但没有取得任何成功。这对我的服务器代码造成了更大的问题,因为我正在编写 xml 正文,并且由于我的元素没有 xmlns="",它的验证失败。
我想了解为什么 xmlns="" 是由架构定义产生的以及如何解决此问题。
这是架构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org"
xmlns="http://www.example.org">
<xs:simpleType name="XYZ">
<xs:restriction base="xs:string">
<xs:maxLength value="10"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="ABC">
<xs:sequence>
<xs:element name="PQR" type="XYZ"/>
</xs:sequence>
</xs:complexType>
<xs:element name="A1">
<xs:complexType>
<xs:sequence>
<xs:element name="result" type="ABC"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
基于此架构,创建以下文档:
<?xml version="1.0" encoding="UTF-8"?>
<A1 xmlns="http://www.example.org">
<result xmlns="">
<PQR></PQR>
</result>
</A1>
我想要这个:
<?xml version="1.0" encoding="UTF-8"?>
<A1 xmlns="http://www.example.org">
<result>
<PQR></PQR>
</result>
</A1>
我已经研究这个并尝试了大约一天的事情。不应该是<result>
元素只是目标命名空间的一部分,使得 xmlns="" 不必要吗?
此外,当我尝试验证它时,我收到以下错误:
System ID: /Users/dev/Desktop/Untitled3.xml
Main validation file: /Users/dev/Desktop/Untitled3.xml
Schema: /Users/dev/Desktop/test.xsd
Engine name: Xerces
Severity: error
Description: cvc-complex-type.2.4.a: Invalid content was found starting with element '{"http://www.example.org":PQR}'. One of '{PQR}' is expected.
Start location: 4:10
End location: 4:13
URL: http://www.w3.org/TR/xmlschema-1/#cvc-complex-type
Adding
elementFormDefault="qualified"
to your xs:schema
元素应该可以解决问题。如果我进行这个小修改,然后让 Oxygen 生成一个示例 XML 文档,结果是
<?xml version="1.0" encoding="UTF-8"?>
<A1 xmlns="http://www.example.org">
<result>
<PQR>PQR0</PQR>
</result>
</A1>
参见例如这个问题和答案解释为什么这有帮助,但其要点是:elementFormDefault="qualified"
告诉验证处理器您在 XSD 中提到的元素应该位于目标命名空间中。默认为elementFormDefault
是“不合格”。
如果将其设置为“unqualified”,则默认情况下所有元素都将被假定为不位于任何命名空间中,但 XML 文档的最外层元素除外,该元素将被假定具有您在此处指定的命名空间:
xmlns="http://www.example.org"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)