【问题标题】:Not able to validate XSD for an XML with a namespace无法验证具有命名空间的 XML 的 XSD
【发布时间】:2019-03-14 12:06:47
【问题描述】:

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

【问题讨论】:

    标签: java xml xsd xml-parsing


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,但是命名空间是必需的,并且需要在 XSD 上支持。
    【解决方案2】:

    解决此问题的一种可能方法是将 XSD 拆分为两个文件:
    一个用于第一个不存在的命名空间(a.xsd),一个用于第二个命名空间(b.xsd),由targetNamespace=...b.xsd 中声明,而a.xsd 不需要该声明。第二个具有自己命名空间的文件是使用&lt;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?"。它不会一对一地复制解决方案,而是受到该网页的启发。

    【讨论】:

    猜你喜欢
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多