使用 XSD 验证混合命名空间 XML - 为什么这不起作用?
Validate mixed-namespaced XML with XSD - why isn't this working?
我创建了两个基本 XML 词汇表:Address 和 Person。
我创建了一个 Address XSD 模式(它对其他模式没有任何依赖性)——这正确地验证了输入 address.xml doc.
我创建了一个导入地址 XSD 的人 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.
从错误看来,'Address' 类型现在(通过导入?)映射到 'Person' 类型。
我需要以这样一种格式保存我的输入文档,以确保在输入文档中可以识别两个命名空间词汇(我不能以删除这两个命名空间的方式重构我的输入文档 - 我可以例如,不要只是将所有内容都推入 'Person' 名称空间)。
我做错了什么?
这是我的文件:
Address.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"/>
请注意,前者引用了复杂类型定义 "Address"(在我的示例中为大写 'A');后者指的是全局元素定义'address'(小写'a').
执行以下操作之一会起作用:
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
命名空间,即使它的类型和它的 children 在
urn:address.com.test
命名空间。
-或-
2 更改架构文档 'Person.xsd' 以使用 'ref' 属性:
发件人:
<xs:element name="address" type="a:Address"/>
收件人:
<xs:element ref="a:address"/>
请注意,前者引用了复杂类型定义“Address”(上例中为大写'A');后者指的是全局元素定义'address'(小写'a').
我创建了两个基本 XML 词汇表:Address 和 Person。 我创建了一个 Address XSD 模式(它对其他模式没有任何依赖性)——这正确地验证了输入 address.xml doc.
我创建了一个导入地址 XSD 的人 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.
从错误看来,'Address' 类型现在(通过导入?)映射到 'Person' 类型。
我需要以这样一种格式保存我的输入文档,以确保在输入文档中可以识别两个命名空间词汇(我不能以删除这两个命名空间的方式重构我的输入文档 - 我可以例如,不要只是将所有内容都推入 'Person' 名称空间)。
我做错了什么?
这是我的文件:
Address.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"/>
请注意,前者引用了复杂类型定义 "Address"(在我的示例中为大写 'A');后者指的是全局元素定义'address'(小写'a').
执行以下操作之一会起作用:
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
命名空间,即使它的类型和它的 children 在
urn:address.com.test
命名空间。
-或-
2 更改架构文档 'Person.xsd' 以使用 'ref' 属性:
发件人:
<xs:element name="address" type="a:Address"/>
收件人:
<xs:element ref="a:address"/>
请注意,前者引用了复杂类型定义“Address”(上例中为大写'A');后者指的是全局元素定义'address'(小写'a').