无法使用命名空间验证XML的XSD

时间:2019-03-14 12:06:47

标签: java xml xsd xml-parsing

我无法使用下面的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/" 

2 个答案:

答案 0 :(得分:0)

问题是XML中的“命名空间”错误(第2行) 当您删除(或更正)它时,它是正确的。

在线验证器 https://www.freeformatter.com/xml-validator-xsd.html

示例XML生成器(来自XSD) http://xsd2xml.com/

命名空间文档 https://www.w3schools.com/XML/xml_namespaces.asp

答案 1 :(得分:0)

针对此问题的一种可能的解决方案是将XSD分为两个文件:
一个用于第一个不存在的命名空间(a.xsd),另一个用于第二个命名空间(b.xsd),由targetNamespace=...b.xsd中声明,而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文件。

此答案的灵感来自以下网页:"Multi-Schema Project: Zero, One, or Many Namespaces?"。它不会以一对一的方式复制解决方案,而是受到该网页的启发。