我无法使用以下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/"
问题是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
解决此问题的一种可能方法是将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复制,而是受到该网页的启发。