我有以下xml
<File>
<FileName>somefile.lis</FileName>
<Metadata>
<HeaderExtension expNum ="0">
<ABC>DUMMY</ABC>
<DEF>JUNK</DEF>
</HeaderExtension>
<HeaderExtension expNum ="1">
<ABC>DUMMY</ABC>
<GHI>Different JUNK</GHI>
</HeaderExtension>
</Metadata>
<File>
元数据标签是可选的。 HeaderExtension标记在Metadata标记下是可选的,Metadata或HeaderExtension下的所有子标记都是未知的。在我的xsd中,我有以下定义的
<xsd:complexType name="MetadataType">
<xsd:sequence>
<xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="FileInfo">
<xsd:sequence>
<xsd:element name="FileName" type="xsd:string"
minOccurs="1" maxOccurs="1" />
<xsd:element name="Metadata" type="MetadataType"
minOccurs="1" maxOccurs="1" />
</xsd:sequence>
但由于某种原因,这会产生错误。 cvc-complex-type.2.4.d:从元素'MetadataType'开始发现无效内容。此时不会有子元素。
如何更改xsd以便验证xml。
答案 0 :(得分:0)
错误
cvc-complex-type.2.4.d: Invalid content was found starting with element 'MetadataType'. No child element is expected at this point.
似乎不是由您的架构引起的。它与Metadata
中any
和lax
的内容无关。这可能是 source XML中的错误。如果你有这样的事情会发生这个错误:
<File xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schema2.xsd">
<FileName>somefile.lis</FileName>
<Metadata>
...
</Metadata>
<MetadataType>...</MetadataType> <!-- unexpected element MetadataType -->
</File>
(我假设复杂类型的文件 - 你没有在你的问题中包含 - 是严格的,不接受名为MetadataType
的元素。)
因此,可能使用其复杂类型的名称而不是元素的名称生成<Metadata>
标记。