更正多个随机排序元素的架构

时间:2013-03-07 16:03:05

标签: .net xml-serialization xsd

我正在创建一个xml文档中的模式,该模式包含多个类型的多个元素,但是按照随机顺序需要在序列化后进行维护然后反序列化(我在VB.NET中编程但是C#答案是很好,所以我没有指定语言。)

<xml version="1.0" encoding="utf-8">
<sample:ABC>
   <sample:DEF></sample:DEF>
   <sample:XYZ></sample:XYZ>
   <sample:DEF></sample:DEF>
   <sample:PNQ></sample:PNQ>
   <sample:DEF></sample:DEF>
   <sample:DEF></sample:DEF>
</sample:ABC>

到目前为止,我有这个由xsd.exe生成的模式:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="ABC">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="DEF" minOccurs="0" />
        <xs:element name="XYZ" minOccurs="0" />
        <xs:element name="PNQ" minOccurs="0" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

然而,这与xml可能进入的所有可能方式都不匹配,显然我已经大量简化了xml和模式,并且只显示了一个样本,以便更容易地演示问题。

我已经看到了使用all元素的建议,但只允许每个孩子中的一个。我也尝试添加重复的子元素(例如两个DEF元素),但这会创建一个“模糊”模式。 我也尝试使用一系列选择元素,但是从模式生成的代码必须使用对象,因此不是类型安全的。我认为可以使用继承来解决这个问题,但我的架构技能并不适合它。

问题是:是否有任何架构元素可用于获得与xml的正确匹配?如果没有,我至少可以创建一个可用于检查xml有效性的模式吗?

1 个答案:

答案 0 :(得分:3)

要按任意顺序和任意数字匹配DEFXYZPNQ元素的abitrary序列,您可以使用

<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns="test" 
  targetNamespace="test" 
  elementFormDefault="qualified">
  <xs:element name="ABC">
    <xs:complexType>
      <xs:sequence maxOccurs="unbounded">
        <xs:element name="DEF" minOccurs="0" />
        <xs:element name="XYZ" minOccurs="0" />
        <xs:element name="PNQ" minOccurs="0" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

与您的架构的唯一区别是为maxOccurs="unbounded"

添加了xs:sequence

请注意,使用.NET类中的标准反序列化无法对此类XML进行反序列化 - 具有相同名称的元素将反序列化为列表或数组,并且必须是连续的。

您可以使用自定义反序列化处理此类案例 - 请参阅herehere

相关问题