XML模式导致没有命名空间的xml元素

时间:2016-02-03 14:48:21

标签: xml validation xsd namespaces schema

我在使用非常简单的架构时遇到了一些麻烦。在模式指定根元素的第一个子元素的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>元素不应该只是targetnamespace的一部分,而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

1 个答案:

答案 0 :(得分:2)

添加

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>

参见例如Error creating new content types. Please make sure contenttypes is migrated before trying to migrate apps individually解释了为什么这会有所帮助,但其要点是:elementFormDefault="qualified"告诉验证处理器,您在XSD中提到的元素应该位于目标命名空间中。 elementFormDefault的默认值为“不合格”。

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

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