首页 > 解决方案 > 无法验证具有命名空间的 XML 的 XSD

问题描述

我无法使用以下 XSD 验证 XML,

<myTest>
  <standardHeader xmlns="http://tow.gow.ho.com/2009/08/StandardHeader/">
    <data>
      <LEVELDATA>D2D</LEVELDATA>
    </data>
  </standardHeader>
</myTest>

XSD 数据

<?xml version="1.0" encoding="UTF-8"?>  
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="myTest">
        <xsd:complexType mixed="true">
            <xsd:sequence>
                <xsd:element name="standardHeader"   minOccurs="0">
                    <xsd:complexType mixed="true">
                        <xsd:sequence>
                            <xsd:element name="data" minOccurs="0">
                                <xsd:complexType mixed="true">
                                    <xsd:sequence>
                                        <xsd:element name="LEVELDATA" minOccurs="0" type="xsd:normalizedString"/>
                                    </xsd:sequence>
                                </xsd:complexType>
                            </xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

使用 XML 验证此 XSD 时出现以下错误,

cvc-complex-type.2.4.a:发现以元素“standardHeader”开头的无效内容。需要“{standardHeader}”之一。

我怎样才能提供这个standardHeader标签:

targetNamespace="http://tow.gow.ho.com/2009/08/StandardHeader/" 

标签: javaxmlxsdxml-parsing

解决方案


此问题的一种可能解决方案是将 XSD 拆分为两个文件:
一个用于第一个不存在的命名空间 ( a.xsd),另一个用于第二个命名空间 ( b.xsd),由targetNamespace=...in b.xsd while声明,a.xsd不需要该声明。具有自己命名空间的第二个文件与<xsd:import namespace="..."指令一起导入。这个命名空间也必须包含在xsd:schema元素的命名空间声明中(这里xmlns:std)。

也是这样a.xsd

<?xml version="1.0" encoding="UTF-8"?>  
<xsd:schema elementFormDefault="qualified" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:std="http://tow.gow.ho.com/2009/08/StandardHeader">
    <xsd:import namespace="http://tow.gow.ho.com/2009/08/StandardHeader"
            schemaLocation="b.xsd" />

    <xsd:element name="myTest">
        <xsd:complexType mixed="true">
            <xsd:sequence>
                <xsd:element ref="std:standardHeader" minOccurs="0">
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

并且b.xsd是:

<?xml version="1.0" encoding="UTF-8"?>  
<xsd:schema elementFormDefault="qualified"  
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="http://tow.gow.ho.com/2009/08/StandardHeader">

    <xsd:element name="standardHeader">
        <xsd:complexType mixed="true">
            <xsd:sequence>
                <xsd:element name="data" minOccurs="0">
                    <xsd:complexType mixed="true">
                        <xsd:sequence>
                            <xsd:element name="LEVELDATA" minOccurs="0" type="xsd:normalizedString"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

这两个 XSD 确实使用其名称空间来验证您的 XML 文件。

这个答案的灵感来自这个网页:“多模式项目:零、一个或多个命名空间?” . 它不会一对一地复制解决方案,而是受到该网页的启发。


推荐阅读