我有一个对象,我想创建一个XML,在ASP.NET 3.5中执行此操作的最佳方法是什么?
我想将它也保存到文件中(Web应用程序)。
我不想序列化对象,因为我将在XML创建过程中修改一些自定义元素名称,属性和值。
答案 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}}来自其属性的对象。 (不过,你可能会更改课程的名称。)