XML 架构导致 xml 元素没有命名空间

XML schema is resulting in an xml element without a namespace

我在处理一个非常简单的架构时遇到了一些问题。在 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

添加

elementFormDefault="qualified"

您的 xs:schema 元素应该可以解决问题。如果我做这个小修改,然后让 Oxygen 生成样本 XML 文档,结果是

<?xml version="1.0" encoding="UTF-8"?>
<A1 xmlns="http://www.example.org">
    <result>
        <PQR>PQR0</PQR>
    </result>
</A1>

参见例如this question and answers 解释为什么这有帮助,但要点是:elementFormDefault="qualified" 告诉验证处理器您在 XSD 中提到的元素应该在目标命名空间中。 elementFormDefault 的默认值为 "unqualified".

如果设置为 "unqualified",默认情况下所有元素都将被假定为不在命名空间中,但 XML 文档的最外层元素除外,该元素将被假定为具有您在此处指定的命名空间:

xmlns="http://www.example.org"