2013-01-24 211 views
2

我有一個非常大的,複雜的XML文件,我希望提取每個元素值到我已經創建的對象。我已經嘗試過WCF DataContractSerializer和普通的XmlSerializer,它們都是非常有問題的。複雜的XML到對象

除了使用上述方法解析我的XML並分配給對象之外,有人可以推薦最簡單的方法來實現上述目的嗎?

我正在考慮只使用XDocument。

我的最終目標是從對象中取值並序列化爲新的XML。

這是我原來的職位 XML deserialization to object error

+0

的XML的一個樣本,以及您所創建的用於保存數據將是有益的類 –

+0

'這兩者都是非常problematic'如何? – I4V

+0

你能提供一些樣本數據嗎?你創建的這個「對象」是什麼? – itsme86

回答

0

的DataContractSerializer和XmlSerializer的只能滋潤XML轉換成你已經有一個對象。也就是說,只有當你從X類型的對象開始,序列化它,然後將它反序列化回X類型時,它們才起作用。通常,如果你正在使用發佈數據協定的服務,或者如果你是一個序列化你自己的數據。請注意,我說他們序列化整個對象。這不僅僅是數據,還包括數據所適用的結構和類型。

由於它不是一個明顯的序列化對象,因此您正在構建自己的對象並使用XDocument將其分開的正確軌道上。

3

我通常使用Microsoft's XML Schema Definition Tool(XSD.EXE)在兩個步驟中,以產生能夠從一個任意XML文檔進行反序列化類:

步驟1:

xsd file.xml [/outputdir:directory] 

生成XSD文件對應你的XML文件

第2步:

xsd file.xsd /classes [/namespace:namespace] [/outputdir:directory] 

生成可使用步驟1中創建的模式進行反序列化的類。

從那裏您可以使用原樣或將對象屬性映射到類的屬性。

+0

+1真棒 - 學到新的東西 – JDB

+0

好的。我完全忘記了這個工具。 – kettch

+0

+1很高興學到新東西 – SKJ

0

我一直在XmlSerializer類和System.Xml.Serialization命名空間中的屬性和類中取得巨大成功。

當我有複雜的XML數據需要反序列化或讀入一個對象時,我總是先走另一條路。首先,實例化.NET對象,然後將其序列化。然後,我會慢慢向.NET對象添加屬性,以控制我希望它被序列化的方式。 無論如何,System.Xml.Serialization命名空間中的類將使您完全控制如何序列化對象。您可以將成員變量序列化爲屬性或元素。您可以序列化對象數組,甚至可以忽略成員變量。您可以將xml元素的名稱更改爲與成員變量名稱不同......我的意思是它非常強大。

但不管怎麼說,關鍵是倒退。首先創建.NET對象,然後開始逐位序列化到XML。一旦你得到它你喜歡它的方式,它會自動地被非常容易地反序列化。

所以自定義類型可序列化/反序列化這樣的:

[Serializable] 
    [XmlRoot(Namespace = "www.google.com", 
    ElementName = "BuildServicOptions", 
    DataType = "string", 
    IsNullable = true)] 
public class Options {...} 

的XML看起來是這樣的:

<BuildServiceOptions ....> 
</BuildServiceOptions> 

陣列可以被序列化這樣的:

[XmlArray("EmailNotifications")] 
[XmlArrayItem("email")] 
public string[] EmailNotifications; 

該XML看起來是這樣的:

<EmailNotifications> 
<email>[email protected]</email> 
<email>[email protected]</email> 
<email>[email protected]</email> 
</EmailNotifications> 

成員變量可以忽略這樣的:

[XmlIgnore] 
public string ServerProjectDir; 

成員變量可以被序列化爲屬性

[XmlAttribute("Name")] 
public string ProjectName; 

如果你有一個自定義的數據類型,它是一個成員變量,那麼,很簡單:只需將序列化屬性添加到該類。事實上,任何需要寫入XML文件的類都應該具有類定義的屬性。

+0

謝謝,這非常有幫助。這是我原來的職位這一問題使用XML序列化,我經歷:http://stackoverflow.com/questions/14506535/xml-deserialization-to-object-error – user1526912