我有一個非常大的,複雜的XML文件,我希望提取每個元素值到我已經創建的對象。我已經嘗試過WCF DataContractSerializer和普通的XmlSerializer,它們都是非常有問題的。複雜的XML到對象
除了使用上述方法解析我的XML並分配給對象之外,有人可以推薦最簡單的方法來實現上述目的嗎?
我正在考慮只使用XDocument。
我的最終目標是從對象中取值並序列化爲新的XML。
這是我原來的職位 XML deserialization to object error
我有一個非常大的,複雜的XML文件,我希望提取每個元素值到我已經創建的對象。我已經嘗試過WCF DataContractSerializer和普通的XmlSerializer,它們都是非常有問題的。複雜的XML到對象
除了使用上述方法解析我的XML並分配給對象之外,有人可以推薦最簡單的方法來實現上述目的嗎?
我正在考慮只使用XDocument。
我的最終目標是從對象中取值並序列化爲新的XML。
這是我原來的職位 XML deserialization to object error
的DataContractSerializer和XmlSerializer的只能滋潤XML轉換成你已經有一個對象。也就是說,只有當你從X類型的對象開始,序列化它,然後將它反序列化回X類型時,它們才起作用。通常,如果你正在使用發佈數據協定的服務,或者如果你是一個序列化你自己的數據。請注意,我說他們序列化整個對象。這不僅僅是數據,還包括數據所適用的結構和類型。
由於它不是一個明顯的序列化對象,因此您正在構建自己的對象並使用XDocument將其分開的正確軌道上。
我通常使用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中創建的模式進行反序列化的類。
從那裏您可以使用原樣或將對象屬性映射到類的屬性。
使用XmlReader
或XmlTextReader
http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx
http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader.aspx
的XmlReader或XmlTextReader的不整個XML加載到內存中,所以這將有助於你分析一個這麼大的XML文件。
我一直在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文件的類都應該具有類定義的屬性。
謝謝,這非常有幫助。這是我原來的職位這一問題使用XML序列化,我經歷:http://stackoverflow.com/questions/14506535/xml-deserialization-to-object-error – user1526912
的XML的一個樣本,以及您所創建的用於保存數據將是有益的類 –
'這兩者都是非常problematic'如何? – I4V
你能提供一些樣本數據嗎?你創建的這個「對象」是什麼? – itsme86