如何在c#中生成有效的XML ?
当前回答
这取决于场景。XmlSerializer当然是一种方法,它具有直接映射到对象模型的优点。在。net 3.5中,XDocument等也非常友好。如果大小非常大,那么XmlWriter是您的好朋友。
对于XDocument的例子:
Console.WriteLine(
new XElement("Foo",
new XAttribute("Bar", "some & value"),
new XElement("Nested", "data")));
或者与XmlDocument相同:
XmlDocument doc = new XmlDocument();
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("Foo"));
el.SetAttribute("Bar", "some & value");
el.AppendChild(doc.CreateElement("Nested")).InnerText = "data";
Console.WriteLine(doc.OuterXml);
如果正在编写大量数据流,那么任何DOM方法(如XmlDocument/XDocument等)都将很快占用大量内存。因此,如果您正在从CSV编写一个100mb的XML文件,您可能会考虑XmlWriter;这是更原始的(一个写一次的消防水管),但非常有效(想象这里有一个大循环):
XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();
最后,通过XmlSerializer:
[Serializable]
public class Foo
{
[XmlAttribute]
public string Bar { get; set; }
public string Nested { get; set; }
}
...
Foo foo = new Foo
{
Bar = "some & value",
Nested = "data"
};
new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo);
这是一个很好的映射到类等的模型;但是,如果您正在做一些简单的事情(或者所需的XML与对象模型并没有真正的直接关联),那么它可能就太过了。XmlSerializer的另一个问题是它不喜欢序列化不可变类型:所有东西都必须有一个公共getter和setter(除非您通过实现IXmlSerializable自己完成这一切,在这种情况下,使用XmlSerializer并没有获得多少好处)。
其他回答
对于简单的情况,我还建议查看XmlOutput——用于构建Xml的流畅接口。
XmlOutput非常适合用于创建具有可读和可维护代码的简单Xml,同时生成有效的Xml。最初的帖子有一些很好的例子。
new XElement("Foo",
from s in nameValuePairList
select
new XElement("Bar",
new XAttribute("SomeAttr", "SomeAttrValue"),
new XElement("Name", s.Name),
new XElement("Value", s.Value)
)
);
这取决于场景。XmlSerializer当然是一种方法,它具有直接映射到对象模型的优点。在。net 3.5中,XDocument等也非常友好。如果大小非常大,那么XmlWriter是您的好朋友。
对于XDocument的例子:
Console.WriteLine(
new XElement("Foo",
new XAttribute("Bar", "some & value"),
new XElement("Nested", "data")));
或者与XmlDocument相同:
XmlDocument doc = new XmlDocument();
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("Foo"));
el.SetAttribute("Bar", "some & value");
el.AppendChild(doc.CreateElement("Nested")).InnerText = "data";
Console.WriteLine(doc.OuterXml);
如果正在编写大量数据流,那么任何DOM方法(如XmlDocument/XDocument等)都将很快占用大量内存。因此,如果您正在从CSV编写一个100mb的XML文件,您可能会考虑XmlWriter;这是更原始的(一个写一次的消防水管),但非常有效(想象这里有一个大循环):
XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();
最后,通过XmlSerializer:
[Serializable]
public class Foo
{
[XmlAttribute]
public string Bar { get; set; }
public string Nested { get; set; }
}
...
Foo foo = new Foo
{
Bar = "some & value",
Nested = "data"
};
new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo);
这是一个很好的映射到类等的模型;但是,如果您正在做一些简单的事情(或者所需的XML与对象模型并没有真正的直接关联),那么它可能就太过了。XmlSerializer的另一个问题是它不喜欢序列化不可变类型:所有东西都必须有一个公共getter和setter(除非您通过实现IXmlSerializable自己完成这一切,在这种情况下,使用XmlSerializer并没有获得多少好处)。
XmlWriter是编写良好XML的最快方法。XDocument, XMLDocument和其他一些也很好,但没有为编写XML进行优化。如果希望尽可能快地编写XML,那么肯定应该使用XmlWriter。
为了简单起见,我只使用System.XML中找到的XmlDocument/XmlNode/XmlAttribute类和XmlDocument DOM。
它为我生成XML,我只需要链接几个项目在一起。
但是,对于较大的内容,我使用XML序列化。
推荐文章
- 如何从枚举中选择一个随机值?
- 驻留在App_Code中的类不可访问
- 在链式LINQ扩展方法调用中等价于'let'关键字的代码
- dynamic (c# 4)和var之间的区别是什么?
- Visual Studio: ContextSwitchDeadlock
- 返回文件在ASP。Net Core Web API
- 自定义HttpClient请求头
- 如果我使用OWIN Startup.cs类并将所有配置移动到那里,我是否需要一个Global.asax.cs文件?
- VS2013外部构建错误"error MSB4019: The imported project <path> was not found"
- 从另一个列表id中排序一个列表
- 等待一个无效的异步方法
- 无法加载文件或程序集…参数不正确
- c#中枚举中的方法
- 如何从字符串中删除新的行字符?
- 如何设置一个默认值与Html.TextBoxFor?