2010-03-01 60 views
1

我有一個對象,我想從中創建一個XML,在ASP.NET 3.5中執行此操作的最佳方法是什麼?創建XML文檔並保存到文件的最佳方式

我想將它保存到一個文件(網絡應用程序)。

我不想序列化對象,因爲我將擁有一些自定義元素名稱以及將在XML創建期間修改的屬性和值。

回答

2

這是一個有點硬不知道「定製」是如何「自定義」來回答,但LINQ到XML是一個不錯的選擇,因爲你有.NET 3.5:

// using variables here to show how the names etc can be decided at runtime 
string elName = "Fred"; 
DateTime when = DateTime.Today; 
int id = 123; 
string idName = "id"; 
var el = new XElement(elName, new XAttribute(idName, id), when); 
el.Save("out.xml"); 

給出的xml:

<Fred id=\"123\">2010-03-01T00:00:00+00:00</Fred> 

如果該文件是巨大,然後XmlWriter可能更有效,但代碼更難。

0

您可以使用System.Xml命名空間。

using System.Xml; 

XmlDocument document = new XmlDocument(); 

XmlNode rootNode = document.CreateElement("root"); 
document.AppendChild(rootNode); 

// Create other nodes related to your object and append them to the root node. 

document.Save("path/to/your/xml/file.xml"); 
0

我在學習序列化之前使用了XmlDocument。

0

爲什麼不實現ISerializable接口?然後,你必須在序列化過程中自己完全控制...

在這裏看到的例子: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx 這裏: http://msdn.microsoft.com/en-us/library/ms182342(VS.80).aspx

您可以XmlSerializer結合這一點,如果你有一個複雜的對象需要序列,你不想自己編寫所有的序列化。

如果它只是要進行特殊序列化的對象的一部分(即某些屬性),則可以使這些對象實現ISerializable,並在序列化期間將值更改爲任何您需要的值。

+0

ISerializable和XmlSerializer沒有關係嗎? – 2010-03-02 00:04:17

0

考慮創建一個使用XML序列化的助手類。這將XML格式與主類的設計分離開來,並且一般來說符合通過合成爲類添加功能的想法。 (事實上​​,即使助手類不使用XML序列化,通常也是這樣做的。)它還允許您聲明式地格式化XML,而無需編寫大量程序代碼。

如何執行此操作:設計助手類,以便以XmlSerializer喜歡的方式公開屬性,並從傳入私有構造函數的類實例中獲取這些值。添加一個靜態的XmlSerializer屬性,以及一個使用XmlSerializer將數據寫入文件或流等的公共靜態方法。喜歡的東西:

[XmlRoot("MyClass")] 
public class MyClassXmlWriter 
{ 
    private static XmlSerializer Serializer = new XmlSerializer(typeof MyClassXmlWriter); 

    public static void Write(MyClass source, Stream st) 
    { 
     Serializer.Serialize(new MyClassXmlWriter(source), st); 
    } 

    private MyClass Source; 

    private MyClassXmlWriter(MyClass source) 
    { 
     Source = source; 
    } 

    [XmlElement("SomeElement")] 
    public string SomeProperty { get { return Source.SomeProperty; } } 

} 

使用這個很簡單,只要:

using (FileStream fs = new FileStream(filename)) 
{ 
    MyClassXmlWriter.Write(myObject, fs); 
} 

請注意,如果你需要實現反序列化,你只要給它的屬性的公共干將,然後實現靜態Read方法反序列化轉換爲新對象MyClassXmlWriter,然後根據其屬性創建並填充MyClass對象。 (儘管你可能會改變這個類的名字。)

相關問題