繁体   English   中英

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

测试.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>

架构1.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>元素也在尝试使用默认命名空间进行验证。

错误:元素“{http://www.w3.org/2001/XMLSchema}schema”:没有可用于验证根的匹配全局声明。

我的要求是为上述示例 XML 生成有效的 XML 模式。

要调整您的 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>

架构1.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>

我找到了上述错误的原因。

在 object.xsd 中,我添加了elementFormDefault="qualified"属性,并更改了元素 object 类型。

<?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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM