针对XSD的XML验证:元素xxx在命名空间zzz中具有无效的子元素yyy

时间:2011-09-21 10:01:12

标签: xml xsd

XSD:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:DataBodyTemperature="Docobo.DataBodyTemperature" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="tDataBodyTemperature">
    <xs:sequence>
      <xs:element name="Answer" type="xs:double" />
      <xs:element minOccurs="0" maxOccurs="1" name="AmbientTemperature" type="xs:double" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="tDataItem">
      <xs:choice>
        <xs:element name="DataBodyTemperature" type="tDataBodyTemperature" />
      </xs:choice>
  </xs:complexType>
  <xs:element name="DataItem">
    <xs:complexType>
      <xs:complexContent mixed="false">
        <xs:extension base="tDataItem">
          <xs:attribute fixed="1" name="SchemaVersion" type="xs:integer" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

XML:

<DataItem>
  <DataBodyTemperature xmlns:DataBodyTemperature="Docobo.DataBodyTemperature">
    <DataBodyTemperature:Answer>37.8</DataBodyTemperature:Answer>
    <DataBodyTemperature:AmbientTemperature>28.5</DataBodyTemperature:AmbientTemperature>
  </DataBodyTemperature >
</DataItem>

我收到验证错误: Xml模式验证失败:元素'DataBodyTemperature'在名称空间'Docobo.DataBodyTemperature'中具有无效的子元素'Answer'。预期可能元素列表:'回答'

1 个答案:

答案 0 :(得分:4)

您的问题是您的架构没有指定目标命名空间 - 因此所有类型都与null命名空间相关联。

您的错误是由于架构指定DataBodyTemperature元素(位于空命名空间中)应仅包含AnswerAmbientTemperature元素(两者都在null namespace),但是在您的文档中,这些元素实际上位于Docobo.DataBodyTemperature命名空间中,基本上使它们成为完全不同的元素。

符合您给定架构的xml样本将是:

<DataItem SchemaVersion="1">
  <DataBodyTemperature>
    <Answer>1</Answer>
    <AmbientTemperature>1</AmbientTemperature>
  </DataBodyTemperature>
</DataItem>

请注意,没有名称空间声明 - 所有元素都在默认名称空间中。我怀疑你真正想要的是修改你的xsd,以便它指定一个目标命名空间。

<xs:schema targetNamespace="Docobo.DataBodyTemperature" xmlns:dbt="Docobo.DataBodyTemperature" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="tDataBodyTemperature">
    <xs:sequence>
      <xs:element name="Answer" type="xs:double" />
      <xs:element minOccurs="0" maxOccurs="1" name="AmbientTemperature" type="xs:double" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="tDataItem">
    <xs:choice>
      <xs:element name="DataBodyTemperature" type="dbt:tDataBodyTemperature" />
    </xs:choice>
  </xs:complexType>
  <xs:element name="DataItem">
    <xs:complexType>
      <xs:complexContent mixed="false">
        <xs:extension base="dbt:tDataItem">
          <xs:attribute fixed="1" name="SchemaVersion" type="xs:integer" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

请注意,您现在还需要限定tDataItemtDataBodyTemperature类型,因为它们不再在null命名空间中声明。

另请注意,在您的sameple XML中,DataItemDataBodyTemperature元素不在“Docobo.DataBodyTemperature”命名空间中,因此现在不会针对上述模式进行验证。

您可能还发现获取模式的示例xml文档很有帮助 - 您可以使用XML模式资源管理器在Visual Studio 2008或更高版本中执行此操作,请参阅How to generate sample XML documents from their DTD or XSD?