2010-03-01 64 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对象。 (尽管你可能会改变这个类的名字。)

相关问题