【问题标题】:XML schema for ordered child elements with different names具有不同名称的有序子元素的 XML 模式
【发布时间】:2014-02-18 06:10:45
【问题描述】:

我需要反序列化一个包含点和弧的配置文件/多边形定义的 XML。

<Pt>
    <X>0.0</X>
    <Y>0.0</Y>
</Pt>
<Arc>
    <X>0.0</X>
    <Y>0.0</Y>
    <Rad>0.0</Rad>
</Arc>

实际的 XML 文件:

<Profile>
    <Pt>...</Pt>
    <Pt>...</Pt>
    <Arc>...</Arc>
    <Pt>...</Pt>
    <Arc>...</Arc>
</Profile>

我很难找到一个解决方案来了解具有不同名称的子元素的顺序。我目前正在使用类似于下面代码的模式,但我显然在不知道 Pts 和 Arcs 的顺序的情况下获得了 Pts 和 Arcs 的单个数组。我尝试创建一个同时使用 Pt 和 Arc 的替代组(点),但没有成功。

<xs:element name="Profile">
  <xs:complexType>
    <xs:sequence>
      <xs:element maxOccurs="unbounded" name="Pt">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="X" type="xs:decimal" />
            <xs:element name="Z" type="xs:decimal" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element maxOccurs="unbounded" name="Arc">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="X" type="xs:decimal" />
            <xs:element name="Z" type="xs:decimal" />
            <xs:element name="Rad" type="xs:decimal" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

【问题讨论】:

  • 对不起,我不明白这个问题。我怀疑我是否听说过反序列化元素的顺序这样的事情,因为这与创建的类对象无关。你确定你真的要反序列化吗?
  • 我在一个 xml 文件上使用 (MySchemaClass)XMLSerializer.Deserialize(),其中 MySchemaClass 是用 xsd MyScheme.xsd /classes 编译的

标签: c# xml schema xsd


【解决方案1】:

我想您想允许PtArc 元素的任意顺序。以下模式将通过在 sequence 声明中设置 maxOccurs="unbounded" 来解决问题。您还必须更正您的 PtArc 声明,因为目前它们在您的数据中使用 Z 而不是 Y

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="pt-type">
    <xs:sequence>
      <xs:element name="X" type="xs:decimal" />
      <xs:element name="Y" type="xs:decimal" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="arc-type">
    <xs:sequence>
      <xs:element name="X" type="xs:decimal" />
      <xs:element name="Y" type="xs:decimal" />
      <xs:element name="Rad" type="xs:decimal" />
    </xs:sequence>
  </xs:complexType>

  <xs:element name="Profile">
    <xs:complexType>
      <xs:sequence maxOccurs="unbounded">
        <xs:choice >
          <xs:element name="Pt" type="pt-type"/>
          <xs:element name="Arc" type="arc-type"/>
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

【讨论】:

  • 这很好用!我想我现在明白这种类型的工作原理了。我将轮廓下的 Pt 和 Arc 都设置为弧型。如果半径为零,则它是一个 Pt。然后,每当我反序列化时,我都会得到一个 arc-type[] 数组,其中的点/弧按 XML 文件中定义的顺序排列。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多