我有一個對象,我想從中創建一個XML,在ASP.NET 3.5中執行此操作的最佳方法是什麼?創建XML文檔並保存到文件的最佳方式
我想將它保存到一個文件(網絡應用程序)。
我不想序列化對象,因爲我將擁有一些自定義元素名稱以及將在XML創建期間修改的屬性和值。
我有一個對象,我想從中創建一個XML,在ASP.NET 3.5中執行此操作的最佳方法是什麼?創建XML文檔並保存到文件的最佳方式
我想將它保存到一個文件(網絡應用程序)。
我不想序列化對象,因爲我將擁有一些自定義元素名稱以及將在XML創建期間修改的屬性和值。
如果你不想序列化,你可以使用XmlWriter。
您應該使用System.Xml.Linq,這是迄今爲止操縱XML的最簡單方法。
這是一個有點硬不知道「定製」是如何「自定義」來回答,但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
可能更有效,但代碼更難。
既然你會有動態文件,我建議System.Xml.Linq.XDocument生成它。然後您只需使用XDocument.Save即可保存。
您可以使用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");
我在學習序列化之前使用了XmlDocument。
爲什麼不實現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
,並在序列化期間將值更改爲任何您需要的值。
考慮創建一個使用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
對象。 (儘管你可能會改變這個類的名字。)
ISerializable和XmlSerializer沒有關係嗎? – 2010-03-02 00:04:17