2013-03-07 22 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