具有不同名称的有序子元素的XML模式

时间:2014-02-17 18:05:07

标签: c# xml schema xsd

我需要对包含点和弧的轮廓/多边形定义的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的substitutionGroup(Point),但我没有成功。

<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>

1 个答案:

答案 0 :(得分:1)

我想您要允许PtArc元素的任意顺序。通过在maxOccurs="unbounded"声明中设置sequence,以下架构可以解决这个问题。您还需要更正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>