【问题标题】:XML validation against XSD: The element xxx has invalid child element yyy in namespace zzz针对 XSD 的 XML 验证:元素 xxx 在命名空间 zzz 中具有无效的子元素 yyy
【发布时间】:2011-09-21 10:01:11
【问题描述】:

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”。预期的可能元素列表:'Answer'

【问题讨论】:

  • 错误消息与您的 XML 不匹配 - is 在该 XML 中没有名为 DataBodyTemperature 的元素。
  • @skaffman:对不起,这是一个错误,我现在已经更正了 XML,它有一个体温元素,但我认为有一些命名空间问题导致了这个错误

标签: xml xsd


【解决方案1】:

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

您的错误是因为架构指定 DataBodyTemperature 元素(位于 null 命名空间中)应仅包含 AnswerAmbientTemperature 元素(两者都在 null 命名空间中声明),但是在在您的文档中,这些元素实际上位于 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 命名空间中声明。

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

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

【讨论】:

  • 否,架构指定类型为 tDataItem 的 DataItem 元素,并且 tDataItem 可以选择元素(当前只有 DataBodyTemperature)。 DataBodyTemperature 是 tDataBodyTemperature 类型,然后包含 2 个元素;答案和AmbientTemperature
  • @Shahid Ah - 你更新了你的问题,我现在已经修正了我的答案。
  • 谢谢贾斯汀。我在这里只放了一个选项“DataBodyTemperature”,但我还有许多其他选择,它们都有不同的命名空间限定符。我们可以使用多个目标命名空间吗?是否可以仅使用命名空间限定 tDataBodyTemperature 并将任何其他元素保留为空命名空间
  • @Shahid 是的,您可以使用多个目标命名空间,但是据我所知,您需要为每个命名空间使用不同的 XSD 架构文档,例如一个描述空命名空间中所有元素的文档和另一个描述所有元素的文档Docobo.DataBodyTemperature 命名空间中的元素。
猜你喜欢
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多