1

我正在从一个包含多种类型的多个元素的 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 有效性的模式吗?

4

1 回答 1

3

要以任意顺序和任意数量匹配DEFXYZ和元素的任意序列,您可以使用:PNQ

<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"forxs:sequence

请注意,虽然这样的 XML 不能使用 .NET 类中的标准反序列化来反序列化 - 具有相同名称的元素被反序列化为列表或数组,并且必须是连续的。

您可以使用自定义反序列化处理这种情况 - 请参见此处此处

于 2013-03-07T21:18:47.810 回答