我正在创建一个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有效性的模式吗?
答案 0 :(得分:3)
要按任意顺序和任意数字匹配DEF
,XYZ
和PNQ
元素的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进行反序列化 - 具有相同名称的元素将反序列化为列表或数组,并且必须是连续的。