创建XML文档并保存到文件的最佳方式
我有一个对象,我想从中创建一个XML,在ASP.NET 3.5中执行此操作的最佳方法是什么?创建XML文档并保存到文件的最佳方式
我想将它保存到一个文件(网络应用程序)。
我不想序列化对象,因为我将拥有一些自定义元素名称以及将在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命名空间。
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