创建XML文档并保存到文件的最佳方法

时间:2010-03-01 22:20:28

标签: c# asp.net xml

我有一个对象,我想创建一个XML,在ASP.NET 3.5中执行此操作的最佳方法是什么?

我想将它也保存到文件中(Web应用程序)。

我不想序列化对象,因为我将在XML创建过程中修改一些自定义元素名称,属性和值。

8 个答案:

答案 0 :(得分:2)

如果不知道“自定义”是如何“自定义”的话,有点难以回答,但LINQ-to-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>

如果文件 huge ,则XmlWriter可能更有效,但代码更难。

答案 1 :(得分:0)

如果您不想序列化,可以使用XmlWriter

答案 2 :(得分:0)

您应该使用System.Xml.Linq,这是迄今为止操作XML的最简单方法。

答案 3 :(得分:0)

由于您将拥有动态文档,因此我建议System.Xml.Linq.XDocument生成它。然后你只需使用XDocument.Save来保存它。

答案 4 :(得分: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");

答案 5 :(得分:0)

在我学习序列化之前,我使用过XmlDocument。

答案 6 :(得分: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,并在序列化期间将值更改为您需要的值

答案 7 :(得分: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);
}

请注意,如果您需要实现反序列化,只需将其属性设为公共getter,然后实现静态Read方法,该方法将反序列化为新的MyClassXmlWriter对象,然后创建并填充{{ 1}}来自其属性的对象。 (不过,你可能会更改课程的名称。)