2011-08-23 51 views
0

我就需要反序列化,看起來像這樣的XML文檔的應用程序工作:序列化XML無節制陣列

<results> 
    <item ...> 
    </item> 
    <item ...> 
    </item> 
    <item ...> 
    </item> 
    ... 
</results> 

所以我已經設置了一個對象模型是這樣的:

[XmlRoot("results")] 
public class Results 
{ 
    [XmlArray("item")] 
    [XmlArrayItem("item", typeof(Item))] 
    public List<Item> Items { get; set; } 
} 

public class Item 
{ 
    [XmlElement("name")] 
    public string Name { get; set; } 

    [XmlElement("description")] 
    public string Description { get; set; } 

    . . . 
} 

我已經嘗試了許多變體,如何聲明和註解Items集合,但是無論我從未在該集合中獲取任何項目。 .NET中是否存在反序列化不包含在公共父元素中的數組的問題(即,本示例中可能包含的內容)?

我無法控制這個XML的格式,所以我必須讓它按原樣工作。我目前正在使用XDocument/XElement/XAttribute來手動讀取和解析XML,但這很痛苦。任何想法爲什麼這不起作用?

在此先感謝。

回答

1

一個鮮爲人知的祕密似乎是隨Visual Studio一起提供的XSD.exe utility。在其他方面可以做,你將需要兩個特點:

從XML文件

c:\>xsd myfile.xml 

生成一個XSD這將從XML推斷XSD吐出來在磁盤上。然後你就可以採取和:

生成XSD文件

c:\>xsd myfile.xsd /classes 

這將產生所有必要的系列化一系列的C#類的C#類對他們的屬性。你不必直接使用它們,但是你一定可以弄清楚.Net期待的是什麼。

+0

感謝您的回覆。我能夠用這種方法正確地反序列化一切。十分優雅。 – lje

1

做這樣的工作時,我的第一步是創建一些示例實例並對它們進行序列化。如果輸出適合你的XML,你準備好讀回來。這通常是最簡單的方法,讓所有的朋友聚在一起。但是數組,列表......有時候真的很棘手。如果你被迫擁有一個特定的模式,那麼爲你的類的某些部分實現ISerializable有時會很有幫助。通過這種方式,您可以微調批評修飾,但可以享受其他部分的默認xml序列化。

1

對於你在你的問題中提供的示例XML的內容,這將做到這一點:

[XmlRoot("results")] 
public class Results 
{ 
    [XmlElement("item")] 
    public List<Item> Items { get; set; } 
} 

它涵蓋了在沒有外部因素,因爲可能被命名爲例如「項目」的情況。

+0

啊,我認爲它必須註釋爲一個數組。我會試試這個,但上面的解決方案非常優雅,我只能這樣做。謝謝你的迴應。 – lje