2010-06-11 54 views
2

我有以下XML這就需要反序列化/序列化:XML序列化查詢

<instance> 
<dog> 
    <items> 
     <item> 
      <label>Spaniel</label> 
     </item> 
    </items> 
</dog> 
<cat> 
    <items> 
     <item> 
      <label>Tabby</label> 
     </item> 
    </items> 
</cat> 
</instance> 

我不能改變的XML結構。

我需要這個映射到以下類:

[Serializable, XmlRoot("instance")] 
public class AnimalInstance 
{ 
    public string Dog { get; set; } 
    public string Cat { get; set; } 
} 

我真的不知道從哪裏在這一個開始,而無需手動解析XML。我想保持代碼儘可能簡短。有任何想法嗎? (不,我的項目實際上並不涉及貓和狗)。

回答

6

一個簡單的工作示例(跳躍的簡潔貓):

using System.Collections.Generic; 
using System.IO; 
using System.Xml.Serialization; 

[XmlRoot("instance")] 
public class AnimalInstance { 
    [XmlElement("dog")] 
    public Dog Dog { get; set; } 
} 

public class Dog { 
    [XmlArray("items")] 
    [XmlArrayItem("item")] 
    public List<Item> Items = new List<Item>(); 
} 

public class Item { 
    [XmlElement("label")] 
    public string Label { get; set; } 
} 

class Program { 
    static void Main(params string[] args) { 
     string xml = @"<instance> 
<dog> 
    <items> 
     <item> 
      <label>Spaniel</label> 
     </item> 
    </items> 
</dog> 
</instance>"; 

     XmlSerializer xmlSerializer = new XmlSerializer(typeof(AnimalInstance)); 
     AnimalInstance instance = (AnimalInstance)xmlSerializer.Deserialize(new StringReader(xml)); 
    } 
} 
+0

好的建議。我最終用得非常多,但是我在'AnimalInstance'內嵌套了所有的類,所以它們沒有明顯暴露。 – 2010-06-11 09:15:00

+0

@David Neale:如果你不希望你的類被公開,你可以創建一個序列化程序集並使用InternalsVisibleToAttribute:檢查這個問題http://stackoverflow.com/questions/2262957/serialize-list-of-類聲明與內部修飾符 – 2010-06-11 09:33:49

0

那麼你可以使用System.Xml.Serialization通過IXmlSerializable的界面做自定義序列得到的結構,只要你想

+0

確實 - 但我希望沒有編寫自定義代碼來解析XML可能會有更好的方法。 – 2010-06-11 08:36:21

2

爲什麼會出現這樣的問題編寫自定義解析代碼?爲您簡單的例子,它實際上可能牽涉較少的代碼使用一個XDocument:

XDocument xdoc = XDocument.Parse(xml); 
AnimalInstance animal = new AnimalInstance() 
{ 
    Dog = xdoc.XPathSelectElement("instance/dog/items/item/label").Value, 
    Cat = xdoc.XPathSelectElement("instance/cat/items/item/label").Value 
}; 
+0

序列化將需要更多的工作; +1,從我這裏,順便:) – 2010-06-11 08:55:12

+0

好的建議。這次我會選擇Paolo的答案,因爲我需要序列化和反序列化。 – 2010-06-11 09:13:41

0

您也可以轉換使用XSL將XML文檔你喜歡的結構化和並行化這一轉變的輸出。但是對於如此簡單的結構,您應該使用另一種解決方案,如Paolo Tedesco提供的解決方案。

1

當與創建XML序列化類的疑問,我找到解決問題的最簡單方法是:

  • 轉儲所有的虛擬數據到XML文件
  • 運行XSD.EXE創建在您的架構文件的.xsd架構文件
  • 運行XSD.EXE創建一個類文件

我在博客中寫了一篇關於它的快速教程發佈前一陣子: http://www.diaryofaninja.com/blog/2010/05/07/make-your-xml-stronglytyped-because-you-can-and-its-easy

它需要不到一分鐘的時間,然後你可以輕鬆地從那裏調整的東西。 XSD.exe是你的的朋友

+0

非常好的一點。 +1 – 2010-06-18 08:45:26