2014-02-17 134 views
0

我需要反序列化包含点和弧的配置文件/多边形定义的XML。具有不同名称的有序子元素的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> 
+0

对不起,但我不明白这个问题。我怀疑自己从未听说过反序列化元素的顺序,因为这与创建的类对象无关。你确定它真的是反序列化吗? – Tarec

+0

我在使用xsd MyScheme.xsd/classes编译MySchemaClass的xml文件上使用(MySchemaClass)XMLSerializer.Deserialize() –

回答

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

这很好用!我想我现在明白这个类型的作品。我将轮廓下的Pt和Arc设置为弧形。如果半径为零,那么它是一个Pt。然后,无论何时反序列化,我都按照XML文件中定义的顺序获得一个arc-type []数组,并带有点/弧。谢谢! –

相关问题