【问题标题】:Validate mixed-namespaced XML with XSD - why isn't this working?使用 XSD 验证混合命名空间 XML - 为什么这不起作用?
【发布时间】:2015-03-04 17:58:10
【问题描述】:

我创建了两个基本的 XML 词汇表:地址和人员。 我创建了一个 Address XSD 架构(它与其他架构没有任何依赖关系) - 这正确验证了输入 address.xml 文档。

我创建了一个导入 Address XSD 的 Person XSD 架构。 我的 Person.xml(混合词汇文件)验证失败,出现以下错误:

XML validation started.
Checking file:[...]/validator/src/main/resources/person.xml...
Referenced entity at "file:[...]/validator/src/main/resources/person.xsd".
Referenced entity at "file:[...]validator/src/main/resources/address.xsd".
cvc-complex-type.2.4.a: Invalid content was found starting with element 'a:address'. One of '{"urn:person.com.test":address}' is expected. [11] 
XML validation finished.

从错误中可以看出,“地址”类型现在(通过导入?)映射到“人员”类型。

我需要保持我的输入文档的格式,以确保两个命名空间词汇在输入文档中是可识别的(我不能重构我的输入文档以删除这两个命名空间 - 我不能例如,只需将所有内容都推入“Person”命名空间)。

我在这里做错了什么?

这是我的文件:

地址.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="urn:address.com.test"
           xmlns="urn:address.com.test"
           xmlns:a="urn:address.com.test"
           elementFormDefault="qualified">
    <xs:element name="address" type="Address" />
    <!-- http://webarchive.nationalarchives.gov.uk/+/http://www.cabinetoffice.gov.uk/media/291370/bs7666-v2-0-xsd-PostCodeType.htm -->
    <xs:simpleType name="PostCodeType">
        <xs:annotation>
            <xs:documentation>complex pattern for postcode, which matches definition, accepted by some parsers is: "(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2})"</xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][A-Z-[CIKMOV]]{2}"/>
        </xs:restriction>
    </xs:simpleType> 
    <xs:complexType name="Address">
        <xs:sequence>
            <xs:element name="Street_name" type="xs:string" minOccurs="1" maxOccurs="4" />
            <xs:element name="Town_City" type="xs:string"/>
            <xs:element name="County" type="xs:string" minOccurs="0"/>
            <xs:element name="Country" type="xs:string"/>
            <xs:element name="Postcode" type="PostCodeType"/>
        </xs:sequence>
    </xs:complexType>   
</xs:schema>

'Address.xml' - 一个实例文档的例子,可以根据上面的模式正确验证:

<?xml version="1.0" encoding="UTF-8"?>
<a:address
    xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
    xmlns:a='urn:address.com.test'
    xsi:schemaLocation='urn:address.com.test address.xsd'>
    <a:Street_name>10 Downing Street </a:Street_name>
    <a:Town_City>London</a:Town_City>
    <a:Country>UK</a:Country>
    <a:Postcode>SW1A 2AA</a:Postcode>
</a:address>

Person.xsd: 与 Address.xsd 的导入:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="urn:person.com.test"
           xmlns="urn:person.com.test"
           xmlns:p="urn:person.com.test"
           xmlns:a="urn:address.com.test"
           elementFormDefault="qualified">
    <xs:import namespace="urn:address.com.test" schemaLocation="address.xsd"/>
    <xs:element name="person" type="Person" />
    <xs:complexType name="Person">
        <xs:sequence>
            <xs:element name="first_name" type="xs:string" />
            <xs:element name="last_name" type="xs:string"/>

                <xs:element name="address" type="a:Address"/>

        </xs:sequence>
    </xs:complexType>   
</xs:schema>

还有“Person.xml”——验证失败的混合词汇文档:

<?xml version="1.0"?>
<p:person 
    xmlns:p="urn:person.com.test"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="urn:person.com.test person.xsd">
    <p:first_name>Joe</p:first_name>
    <p:last_name>Bloggs</p:last_name>
    <a:address xmlns:a="urn:address.com.test">
        <a:Street_name>10 Downing Street</a:Street_name>
        <a:Town_City>London</a:Town_City>
        <a:Country>UK</a:Country>
        <a:Postcode>SW1A 2AA</a:Postcode>
    </a:address>
</p:person>

我正在使用 Netbeans 8 运行验证。

编辑:

从接受的答案;我选择的更改是在 Person.xsd 中更改以下内容:

发件人:

<xs:element name="address" type="a:Address"/>

收件人:

<xs:element ref="a:address"/>

请注意,前者指的是复杂类型定义“地址”(在我的示例中为大写“A”);而后者指的是全局元素定义'address'(小写'a')。

【问题讨论】:

    标签: xml validation xsd schema


    【解决方案1】:

    执行以下操作之一将起作用:

    1 如下更改 XML 实例“Person.xml”:

    address 元素的命名空间前缀从a 更改为p。具体来说,改变:

        <a:address xmlns:a="urn:address.com.test">
    

    收件人:

        <p:address xmlns:a="urn:address.com.test">
    

    因为address 元素本身在urn:person.com.test 命名空间,即使它的类型和它的孩子在 urn:address.com.test 命名空间。

    -或-

    2 将架构文档“Person.xsd”更改为使用“ref”属性:

    发件人:

        <xs:element name="address" type="a:Address"/>
    

    收件人:

        <xs:element ref="a:address"/>
    

    请注意,前者指的是复杂类型定义“地址”(上例中的大写“A”);而后者指的是全局元素定义'address'(小写'a')。

    【讨论】:

    • 谢谢,有机会我会试试的。我是否只需要面对我必须在此处更改输入 XML 的事实,那么您认为呢?
    • 不客气。不,如果您愿意,您可以更改 XSD。
    • 好的,我必须先消化你的解释,然后试试这个——我不确定用什么方法来改变 xsd——我实际上是在尝试对一个问题进行逆向工程——输入(混合词汇)Xml 必须保持不变以供我测试......
    • 我已经更新了答案,以展示如何修改 XSD 并保持 XML 不变。
    • 谢谢!那个 ref 属性看起来很有趣 - 我仍然需要尝试这个,然后我会再次报告谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-10-29
    • 2012-02-02
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多