为具有自定义 xsi:type 元素的 XML 创建 XSD 时出现命名空间错误
Getting namespace error when creating XSD for XML which has custom xsi:type element
我正在尝试为小型 XML 创建 XSD,它在根元素中的默认命名空间为 <POSLog xmlns="http://www.nrf-arts.org/IXRetail/namespace/">
。在根元素下有 <object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="A">
命名空间以及自定义 xsi:type
。以下是 XML 和 XSD。
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<POSLog xmlns="http://www.nrf-arts.org/IXRetail/namespace/">
<object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="A">
<elt1>test1</elt1>
<elt2>test2</elt2>
<elt3>test3</elt3>
</object>
<SequenceNumber xmlns:ns2="http://www.nrf-arts.org/IXRetail/namespace/" xmlns="">3</SequenceNumber>
</POSLog>
object.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://www.nrf-arts.org/IXRetail/namespace/" targetNamespace="http://www.nrf-arts.org/IXRetail/namespace/" attributeFormDefault="unqualified" elementFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="schema1.xsd" />
<xs:element name="POSLog">
<xs:complexType>
<xs:sequence>
<xs:element ref="object" />
<xs:element ref="SequenceNumber" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
schema1.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="object">
<xs:sequence>
<xs:element name="elt1" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="A">
<xs:complexContent>
<xs:extension base="object">
<xs:sequence>
<xs:element name="elt2" type="xs:string"/>
<xs:element name="elt3" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="SequenceNumber" type="xs:unsignedByte" />
<xs:element name="object" type="object" />
</xs:schema>
当我尝试验证 XSD 时,出现以下错误。出现该错误的原因是 <object>
元素也在尝试使用默认命名空间进行验证。
ERROR: Element '{http://www.w3.org/2001/XMLSchema}schema': No matching
global declaration available for the validation root.
我的要求是为上述示例 XML 生成有效的 XML 模式。
我找到了上述错误的原因。
在 object.xsd 中,我添加了 elementFormDefault="qualified"
属性并更改了元素对象类型。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://www.nrf-arts.org/IXRetail/namespace/" targetNamespace="http://www.nrf-arts.org/IXRetail/namespace/" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="schema1.xsd" />
<xs:complexType name="A">
<xs:sequence>
<xs:element name="elt1" type="xs:string"/>
<xs:element name="elt2" type="xs:string"/>
<xs:element name="elt3" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="POSLog">
<xs:complexType>
<xs:sequence>
<xs:element name="object">
</xs:element>
<xs:element ref="SequenceNumber" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
调整您的 XSD 以验证您的 XML:
观察到 POSLog
和 object
在 "http://www.nrf-arts.org/IXRetail/namespace/"
命名空间中,而 SequenceNumber
不在任何命名空间中。
因此,将您的定义分组,使 POSLog
和 object
在一个 XSD (object.xsd
) 中,而 SequenceNumber
是在另一个 (schema1.xsd
).
相应地重新分配您的类型定义。
以下是您的 XSD 验证您的 XML 所需的一整套调整:
原版XML
<?xml version="1.0" encoding="UTF-8"?>
<POSLog xmlns="http://www.nrf-arts.org/IXRetail/namespace/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nrf-arts.org/IXRetail/namespace/ object.xsd">
<object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="A">
<elt1>test1</elt1>
<elt2>test2</elt2>
<elt3>test3</elt3>
</object>
<SequenceNumber xmlns:ns2="http://www.nrf-arts.org/IXRetail/namespace/" xmlns="">3</SequenceNumber>
</POSLog>
object.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="http://www.nrf-arts.org/IXRetail/namespace/"
targetNamespace="http://www.nrf-arts.org/IXRetail/namespace/"
attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="schema1.xsd"/>
<xs:element name="POSLog">
<xs:complexType>
<xs:sequence>
<xs:element ref="ns2:object" />
<xs:element ref="SequenceNumber" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="object" type="ns2:object" />
<xs:complexType name="object">
<xs:sequence>
<xs:element name="elt1" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="A">
<xs:complexContent>
<xs:extension base="ns2:object">
<xs:sequence>
<xs:element name="elt2" type="xs:string"/>
<xs:element name="elt3" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
schema1.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="SequenceNumber" type="xs:unsignedByte" />
</xs:schema>
我正在尝试为小型 XML 创建 XSD,它在根元素中的默认命名空间为 <POSLog xmlns="http://www.nrf-arts.org/IXRetail/namespace/">
。在根元素下有 <object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="A">
命名空间以及自定义 xsi:type
。以下是 XML 和 XSD。
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<POSLog xmlns="http://www.nrf-arts.org/IXRetail/namespace/">
<object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="A">
<elt1>test1</elt1>
<elt2>test2</elt2>
<elt3>test3</elt3>
</object>
<SequenceNumber xmlns:ns2="http://www.nrf-arts.org/IXRetail/namespace/" xmlns="">3</SequenceNumber>
</POSLog>
object.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://www.nrf-arts.org/IXRetail/namespace/" targetNamespace="http://www.nrf-arts.org/IXRetail/namespace/" attributeFormDefault="unqualified" elementFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="schema1.xsd" />
<xs:element name="POSLog">
<xs:complexType>
<xs:sequence>
<xs:element ref="object" />
<xs:element ref="SequenceNumber" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
schema1.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="object">
<xs:sequence>
<xs:element name="elt1" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="A">
<xs:complexContent>
<xs:extension base="object">
<xs:sequence>
<xs:element name="elt2" type="xs:string"/>
<xs:element name="elt3" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="SequenceNumber" type="xs:unsignedByte" />
<xs:element name="object" type="object" />
</xs:schema>
当我尝试验证 XSD 时,出现以下错误。出现该错误的原因是 <object>
元素也在尝试使用默认命名空间进行验证。
ERROR: Element '{http://www.w3.org/2001/XMLSchema}schema': No matching global declaration available for the validation root.
我的要求是为上述示例 XML 生成有效的 XML 模式。
我找到了上述错误的原因。
在 object.xsd 中,我添加了 elementFormDefault="qualified"
属性并更改了元素对象类型。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://www.nrf-arts.org/IXRetail/namespace/" targetNamespace="http://www.nrf-arts.org/IXRetail/namespace/" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="schema1.xsd" />
<xs:complexType name="A">
<xs:sequence>
<xs:element name="elt1" type="xs:string"/>
<xs:element name="elt2" type="xs:string"/>
<xs:element name="elt3" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="POSLog">
<xs:complexType>
<xs:sequence>
<xs:element name="object">
</xs:element>
<xs:element ref="SequenceNumber" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
调整您的 XSD 以验证您的 XML:
观察到
POSLog
和object
在"http://www.nrf-arts.org/IXRetail/namespace/"
命名空间中,而SequenceNumber
不在任何命名空间中。因此,将您的定义分组,使
POSLog
和object
在一个 XSD (object.xsd
) 中,而SequenceNumber
是在另一个 (schema1.xsd
).相应地重新分配您的类型定义。
以下是您的 XSD 验证您的 XML 所需的一整套调整:
原版XML
<?xml version="1.0" encoding="UTF-8"?>
<POSLog xmlns="http://www.nrf-arts.org/IXRetail/namespace/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nrf-arts.org/IXRetail/namespace/ object.xsd">
<object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="A">
<elt1>test1</elt1>
<elt2>test2</elt2>
<elt3>test3</elt3>
</object>
<SequenceNumber xmlns:ns2="http://www.nrf-arts.org/IXRetail/namespace/" xmlns="">3</SequenceNumber>
</POSLog>
object.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="http://www.nrf-arts.org/IXRetail/namespace/"
targetNamespace="http://www.nrf-arts.org/IXRetail/namespace/"
attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="schema1.xsd"/>
<xs:element name="POSLog">
<xs:complexType>
<xs:sequence>
<xs:element ref="ns2:object" />
<xs:element ref="SequenceNumber" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="object" type="ns2:object" />
<xs:complexType name="object">
<xs:sequence>
<xs:element name="elt1" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="A">
<xs:complexContent>
<xs:extension base="ns2:object">
<xs:sequence>
<xs:element name="elt2" type="xs:string"/>
<xs:element name="elt3" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
schema1.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="SequenceNumber" type="xs:unsignedByte" />
</xs:schema>