我无法使用下面的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/"
答案 0 :(得分:0)
问题是XML中的“命名空间”错误(第2行) 当您删除(或更正)它时,它是正确的。
在线验证器 https://www.freeformatter.com/xml-validator-xsd.html
示例XML生成器(来自XSD) http://xsd2xml.com/
答案 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?"。它不会以一对一的方式复制解决方案,而是受到该网页的启发。