导入另一个命名空间并使用其类型声明的 XSD 问题

Posted

技术标签:

【中文标题】导入另一个命名空间并使用其类型声明的 XSD 问题【英文标题】:XSD problem importing another namespace and using its type declarations 【发布时间】:2021-12-17 09:18:14 【问题描述】:

我已经习惯了 XML 模式,并尝试将另一个模式导入到我自己的模式中。

初始架构文件test.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
  targetNamespace="test"
  xmlns="test"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  elementFormDefault="qualified" >

    <xs:complexType name="Test">
        <xs:all>
            <xs:element name="test-import" minOccurs="0" type="xs:string" />
        </xs:all>
    </xs:complexType>

</xs:schema>

导入架构test2.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
  targetNamespace="test2"
  xmlns="test2"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:test="test"
  elementFormDefault="qualified" >

    <xs:import namespace="test" schemaLocation="./test.xsd" />

    <xs:element name="project">
        <xs:complexType>
            <xs:sequence>

                <xs:element name="test" type="test:Test" />

                <xs:element name="test2" type="Model" />
                
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="Model">
        <xs:all>
            <xs:element name="model-test" minOccurs="0" type="xs:string" />
        </xs:all>
    </xs:complexType>

</xs:schema>

最后是导入命名空间test.xml的test.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<file xmlns="test2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="./test2.xsd">

    <test>
        <test-import>Text</test-import>
    </test>
    
    <test2>
        <model-test>Text</model-test>
    </test2>

</file>

最后,标签 test2 可以正常工作,但在 &lt;test-import&gt;Text&lt;/test-import&gt; 我会收到错误消息:

 - test-import

One of the following is expected:
 - test-import

Error indicated by:
 test
with code:xml(cvc-complex-type.2.4.a)```

【问题讨论】:

我在您的 XML 中发现了一些错误。根据 test2.xsd,根标签 &lt;file&gt; 应该是 &lt;project&gt;。此外,您的 XML 只有 1 个命名空间声明,但需要 2 个,否则您不能将 &lt;test&gt; 标记放入命名空间“test2”。 【参考方案1】:

问题太多,无法一一列出,但您可以在下面找到所有已纠正的错误,以便您的 XML 能够成功地针对您的 XSD 进行验证。

另见

xmlns, xmlns:xsi, xsi:schemaLocation, and targetNamespace? How to link XML to XSD using schemaLocation or noNamespaceSchemaLocation? Why are XML namespaces HTTP addresses?

已纠正所有错误的文件集

test.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://example.com/test2" 
         xmlns:test="https://example.com/test"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://example.com/test2 test2.xsd">
  <test>
    <test:test-import>Text</test:test-import>
  </test>
  <test2>
    <model-test>Text</model-test>
  </test2>
</project>

test2.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
    targetNamespace="https://example.com/test2"
    xmlns="https://example.com/test2"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:test="https://example.com/test"
    elementFormDefault="qualified" >

  <xs:import namespace="https://example.com/test" schemaLocation="test.xsd" />

  <xs:element name="project">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="test" type="test:Test" />
        <xs:element name="test2" type="Model" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="Model">
    <xs:all>
      <xs:element name="model-test" minOccurs="0" type="xs:string" />
    </xs:all>
  </xs:complexType>

</xs:schema>

test.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
    targetNamespace="https://example.com/test"
    xmlns="https://example.com/test"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" >

  <xs:complexType name="Test">
    <xs:all>
      <xs:element name="test-import" minOccurs="0" type="xs:string" />
    </xs:all>
  </xs:complexType>

</xs:schema>

【讨论】:

以上是关于导入另一个命名空间并使用其类型声明的 XSD 问题的主要内容,如果未能解决你的问题,请参考以下文章

命名空间中的类并使用模板类型作为返回类型时的全局范围友元运算符声明

XSD 到 XML 的导入

xsd:any 元素的命名空间前缀并使用 XSLT 添加命名空间前缀

『XML』XML/XSD命名空间解析

类型命名空间未声明或不是简单类型

将 DLL 导入 Unity - 找不到类型或命名空间