2013-03-07 54 views
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有效性的模式吗?

+0

谢谢,我错过了,现在修复 – 2013-03-08 08:21:40

回答

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> 

与模式的唯一区别是xs:sequence

注意添加maxOccurs="unbounded"尽管这样的XML不能使用.NET类中的标准反序列化进行反序列化 - 具有相同名称的元素被反序列化为列表或数组,并且必须是连续的。

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

+0

这是一个关于反序列化的耻辱,但这正是我所怀疑的。无法在一个解决方案中获得一切。 – 2013-03-08 08:28:08

+1

@ClaraOnager:实际上,我只记得有关'IXmlSerializable' - 请参阅扩展的答案 – MiMo 2013-03-08 14:57:51

+0

我明白**为什么**现在可以工作了,因为看到了这个答案:http://stackoverflow.com/questions/7469378/any-difference-当你使用min-maxoccurs-at-sequence-rather-of-element-level 当你在序列级别使用maxoccurs unbounded时,你可以重复一遍又一遍的元素集合(aka sequence)。与minoccurs零相结合,这正是我所需要的 – 2013-03-11 10:28:34