在XSD + c#中,如何处理元素的替换,将其转换为POCO并返回而又不失去原始顺序?

时间:2018-06-27 15:46:37

标签: c# serialization xsd deserialization

我收到了要编辑并发送回的XML文件。我无法更改收到的文件的结构。我为这些文件创建了一个XSD,在xsd.exe中使用它来生成c#类。 为了验证它,我只需要执行XML-> POCO-> XML并将输出与原始文件进行比较即可。

我的XML文件包含以下内容:

<infos>
  <info />
  <break />
  <info />
  <break />
  <info />
</infos>

您看到的是信息与中断的交替。有时,它只能包含:

<infos>
  <info />
</infos>

甚至

<infos />

任何人都可以帮助我构建适当的XSD部分,以生成的代码保留原始顺序的方式来表示这一点吗?

到目前为止,我最好的猜测是:

<xs:element name="infos">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="info" />
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="break" minOccurs="0" />
        <xs:element ref="info" />
      </xs:sequence>
    </xs:sequence>
  </xs:complexType>
</xs:element>

但是在我反序列化的对象中,这不能处理更多的事情:

<infos>
  <info />
  <break />
  <info />
</infos>

也就是说,我在第二条信息之后失去了任何东西。

我也尝试过:

<xs:element name="infos">
  <xs:complexType>
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="info" />
      <xs:element ref="break" minOccurs="0" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

或:

<xs:element name="infos">
  <xs:complexType>
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      </xs:sequence>
        <xs:element ref="info" />
        <xs:element ref="break" minOccurs="0" />
      </xs:sequence>
    </xs:sequence>
  </xs:complexType>
</xs:element>

但在两种情况下,最终输出将是:

<infos>
  <info />
  <info />
  <info />
  <break />
  <break />
</infos>

也就是说,原始订单丢失了。

由于我可能会定期更新XSD文件并重新生成代码,因此我尽可能避免修改生成的代码。

任何帮助将不胜感激。

塞德里克。

0 个答案:

没有答案