xsd表示包含未知子标签的可选XML标记

时间:2014-03-05 11:47:59

标签: xml xsd

我有以下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。

1 个答案:

答案 0 :(得分:0)

错误

cvc-complex-type.2.4.d: Invalid content was found starting with element 'MetadataType'. No child element is expected at this point.

似乎不是由您的架构引起的。它与Metadataanylax的内容无关。这可能是 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>标记。