无法为具有命名空间的XML验证XSD

问题描述 投票:0回答:2

我无法使用以下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
2个回答
0
投票

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

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

示例XML-Generator(来自XSD)http://xsd2xml.com/

Namespace-Doc https://www.w3schools.com/XML/xml_namespaces.asp


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?"。它不会将解决方案从1对1复制,而是受到该网页的启发。

© www.soinside.com 2019 - 2024. All rights reserved.