2016-03-03 59 views
1

我想反序列化簡單的XML文件:反序列化的XML與內部陣列

<thesaurus xmlns="http://marklogic.com/xdmp/thesaurus"> 
    <metadata> 
    </metadata> 
    <entry> 
     <term>a</term> 
      <synonym> 
       <term>as</term> 
      </synonym> 
    </entry> 
    <entry> 
     <term>b</term> 
      <synonym> 
       <term>bs</term> 
      </synonym> 
      <synonym> 
       <term>bss</term> 
      </synonym> 
    </entry> 
</thesaurus> 

我使用XmlSerializer的是這樣的:

var xmlSerializer = new XmlSerializer(typeof(Thesaurus)); 

var thesaurus = xmlSerializer.Deserialize(stream); 

我的模型看起來是這樣的:

[Serializable] 
[XmlRoot("thesaurus", Namespace = "http://marklogic.com/xdmp/thesaurus")] 
public class Thesaurus 
{ 
    [XmlElement("metadata")] 
    public Metadata Metadata { get; set; } 
    [XmlElement("entry")] 
    public List<Entry> Entries { get; set; } 
} 

public class Metadata 
{ 

} 
public class Entry 
{ 
    [XmlElement("term")] 
    public string Term { get; set; } 
    [XmlElement("synonym")] 
    public String[] Synonym { get; set; } 
} 

因此,當我運行此代碼時,我使用解析的元數據獲取反序列化的同義詞庫對象,並且入口填充termsynonym字段。我無法獲得這裏的所有條目。

當我註釋掉Synonym領域它開始給我的詞庫對象條目。我不能在<entries>標籤中包裝條目,因爲它是我用這個XML文件提供的應用程序的一些內部格式。

任何人有任何想法如何正確解析這個XML文件?我試圖尋找解決方案,但這個xml看起來與例子中的很不一樣。

+0

當您使用的XmlElement你需要一個新的類來獲取數據。所以你需要一個班級名詞和一個班級的同義詞。 – jdweng

+0

@jdweng很顯然,我錯過了這裏的一個,因爲它將SOMEHOW反序列化的同義詞和SOMEHOW反序列化的同義詞/術語排列爲 – wudzik

回答

1

好了,如果你需要保持內部synonim方面領域的場陣列需要在您進入類更改爲這樣的事情:

public class Entry 
{ 
    [XmlElement("term")] 
    public string Term { get; set; }    

    [XmlElement("synonim")] 
    public Term[] Synonym { get; set; } 
} 

還你需要添加額外的一個:

public class Term 
{ 
    [XmlElement("term")] 
    public string Value { get; set; } 
} 

這樣你就會有你需要的東西。 因此,額外的層次添加了額外的層次結構級別。

請在下面找到您的測試代碼:

 var xmlSerializer = new XmlSerializer(typeof(Thesaurus)); 

     var r = new Thesaurus(); 
     r.Entries = new List<Entry>(); 
     r.Metadata = new Metadata(); 

     r.Entries.Add(new Entry() 
     { 
      Synonym = new Term[] { new Term(){Value = "1"}, new Term() {Value = "2"}, }, 
      Term = "Term1" 
     }); 

     r.Entries.Add(new Entry() 
     { 
      Synonym = new Term[] { new Term() { Value = "3" }, new Term() { Value = "4" }, }, 
      Term = "Term2" 
     }); 

     using (TextWriter writer = new StreamWriter(@"c:\111.xml")) 
     { 
      xmlSerializer.Serialize(writer, r); 
      writer.Close(); 
     } 


     using (TextReader reader = new StreamReader(@"c:\111.xml")) 
     { 
      Thesaurus tt = xmlSerializer.Deserialize(reader) as Thesaurus; 
      Console.Write(tt.Entries.Count); 
      reader.Close(); 
     } 
+0

,謝謝!我錯過了同義詞標籤中的''標籤 – wudzik