为具有自定义 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:

  1. 观察到 POSLogobject"http://www.nrf-arts.org/IXRetail/namespace/" 命名空间中,而 SequenceNumber 不在任何命名空间中。

  2. 因此,将您的定义分组,使 POSLogobject 在一个 XSD (object.xsd) 中,而 SequenceNumber 是在另一个 (schema1.xsd).

  3. 相应地重新分配您的类型定义。

以下是您的 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>