#1 楼
这取决于场景。XmlSerializer
当然是一种方法,并且具有直接映射到对象模型的优势。在.NET 3.5中,XDocument
等也非常友好。如果尺寸很大,那么XmlWriter
是您的朋友。对于
XDocument
示例:Console.WriteLine(
new XElement("Foo",
new XAttribute("Bar", "some & value"),
new XElement("Nested", "data")));
或与
XmlDocument
相同:<如果要写入大量数据,则任何DOM方法(例如XmlDocument
/ XDocument
等)都将迅速占用大量内存。因此,如果您要从CSV写入100 MB XML文件,则可以考虑使用XmlWriter
;这比较原始(一次写入型firehose),但是非常有效(在这里想象一个大循环):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);
最后,通过
XmlSerializer
:XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();
这是一个很好的模型,用于映射到类等。但是,如果您执行简单的操作(或者所需的XML确实与对象模型没有直接关联),则可能会过大。
XmlSerializer
的另一个问题是它不喜欢序列化不可变类型:所有内容都必须具有公共getter和setter(除非您通过实现IXmlSerializable
自己完成所有操作,在这种情况下,使用XmlSerializer
并不会带来太多好处)。 br />#2 楼
我尝试过的最好的方法是LINQ to XSD(大多数开发人员都不知道)。您给它一个XSD Schema,它在后台为您生成一个完美映射的,完整的强类型对象模型(基于LINQ to XML),它真的很容易使用-并在其中更新和验证您的对象模型和XML。即时的。虽然它仍然是“ Preview”,但我还没有遇到任何错误。如果您具有如下所示的XSD架构:
<xs:element name="RootElement">
<xs:complexType>
<xs:sequence>
<xs:element name="Element1" type="xs:string" />
<xs:element name="Element2" type="xs:string" />
</xs:sequence>
<xs:attribute name="Attribute1" type="xs:integer" use="optional" />
<xs:attribute name="Attribute2" type="xs:boolean" use="required" />
</xs:complexType>
</xs:element>
那么您可以像这样简单地构建XML:
RootElement rootElement = new RootElement;
rootElement.Element1 = "Element1";
rootElement.Element2 = "Element2";
rootElement.Attribute1 = 5;
rootElement.Attribute2 = true;
,或者简单地从文件中加载XML,就像这样: >
或像这样保存它:
RootElement rootElement = RootElement.Load(filePath);
rootElement.Untyped
还产生XElement形式的元素(从LINQ到XML)。评论
似乎这段代码无法正常工作。当我不想这样做时,没有对RootElement应用保存功能
– DanilGholtsman
2014年3月31日5:22
#3 楼
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)
)
);
#4 楼
XmlWriter是编写良好XML的最快方法。 XDocument,XMLDocument和其他一些文件也能很好地工作,但是并未针对编写XML进行优化。如果要尽可能快地编写XML,则绝对应使用XmlWriter。评论
也就是说,如果您希望计算机尽可能快地编写XML。如果您(开发人员)希望以最简单,最自然的方式创建XML,那么XmlWriter可能不是解决方案!
– sjy
14年2月24日在8:01
#5 楼
过去,我创建了XML模式,然后使用工具生成将序列化到该模式的C#类。 XML架构定义工具是一个示例http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx
#6 楼
我认为该资源足以满足XML的适度保存/加载要求:使用C#读取/写入XML。我的任务是存储音乐符号。我选择XML,是因为我认为.NET已经足够成熟,可以轻松解决该任务。我是对的:)这是我的歌曲文件原型:
<music judul="Kupu-Kupu yang Lucu" pengarang="Ibu Sud" tempo="120" birama="4/4" nadadasar="1=F" biramapembilang="4" biramapenyebut="4">
<not angka="1" oktaf="0" naikturun="" nilai="1"/>
<not angka="2" oktaf="0" naikturun="" nilai="0.5"/>
<not angka="5" oktaf="1" naikturun="/" nilai="0.25"/>
<not angka="2" oktaf="0" naikturun="\" nilai="0.125"/>
<not angka="1" oktaf="0" naikturun="" nilai="0.0625"/>
</music>
可以很容易地解决:
对于保存到文件:
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
saveFileDialog1.Title = "Save Song File";
saveFileDialog1.Filter = "Song Files|*.xsong";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create);
XmlTextWriter w = new XmlTextWriter(fs, Encoding.UTF8);
w.WriteStartDocument();
w.WriteStartElement("music");
w.WriteAttributeString("judul", Program.music.getTitle());
w.WriteAttributeString("pengarang", Program.music.getAuthor());
w.WriteAttributeString("tempo", Program.music.getTempo()+"");
w.WriteAttributeString("birama", Program.music.getBirama());
w.WriteAttributeString("nadadasar", Program.music.getNadaDasar());
w.WriteAttributeString("biramapembilang", Program.music.getBiramaPembilang()+"");
w.WriteAttributeString("biramapenyebut", Program.music.getBiramaPenyebut()+"");
for (int i = 0; i < listNotasi.Count; i++)
{
CNot not = listNotasi[i];
w.WriteStartElement("not");
w.WriteAttributeString("angka", not.getNot() + "");
w.WriteAttributeString("oktaf", not.getOktaf() + "");
String naikturun="";
if(not.isTurunSetengah())naikturun="\";
else if(not.isNaikSetengah())naikturun="/";
w.WriteAttributeString("naikturun",naikturun);
w.WriteAttributeString("nilai", not.getNilaiNot()+"");
w.WriteEndElement();
}
w.WriteEndElement();
w.Flush();
fs.Close();
}
}
对于加载文件:
openFileDialog1.Title = "Open Song File";
openFileDialog1.Filter = "Song Files|*.xsong";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);
XmlTextReader r = new XmlTextReader(fs);
while (r.Read())
{
if (r.NodeType == XmlNodeType.Element)
{
if (r.Name.ToLower().Equals("music"))
{
Program.music = new CMusic(r.GetAttribute("judul"),
r.GetAttribute("pengarang"),
r.GetAttribute("birama"),
Convert.ToInt32(r.GetAttribute("tempo")),
r.GetAttribute("nadadasar"),
Convert.ToInt32(r.GetAttribute("biramapembilang")),
Convert.ToInt32(r.GetAttribute("biramapenyebut")));
}
else
if (r.Name.ToLower().Equals("not"))
{
CNot not = new CNot(Convert.ToInt32(r.GetAttribute("angka")), Convert.ToInt32(r.GetAttribute("oktaf")));
if (r.GetAttribute("naikturun").Equals("/"))
{
not.setNaikSetengah();
}
else if (r.GetAttribute("naikturun").Equals("\"))
{
not.setTurunSetengah();
}
not.setNilaiNot(Convert.ToSingle(r.GetAttribute("nilai")));
listNotasi.Add(not);
}
}
else
if (r.NodeType == XmlNodeType.Text)
{
Console.WriteLine("\tVALUE: " + r.Value);
}
}
}
}
}
#7 楼
为了简单起见,我只使用System.XML中的XmlDocument / XmlNode / XmlAttribute类和XmlDocument DOM。它为我生成XML,我只需要将几个项目链接在一起。
但是,在较大的事情上,我使用XML序列化。
#8 楼
对于简单的情况,我还建议您看一下XmlOutput,它是构建Xml的流畅接口。XmlOutput非常适合使用可读性和可维护性代码创建简单的Xml,同时生成有效的Xml。原始的帖子有一些很好的例子。
#9 楼
如上所述。我使用stringbuilder.append()。
非常简单,然后可以执行xmldocument.load(strinbuilder对象作为参数)。
您可能会发现自己在append参数中使用了string.concat,但这是一种非常简单的方法。
评论
除非您忘记正确编码并编写非法的Xml。
–罗伯特·保尔森(Robert Paulson)
08年11月13日在21:07
这个答案被完全抨击了,但是基于这个问题,我看了我自己的构建XML的实现之一。对于我的特定项目,我一直发现通过StringBuilder进行构建比使用XDocument / XmlWriter的处理时间快10%。但是,我对XML很满意,这是针对我的特定项目的。 (作为参考,最终的XML大小约为3.4 MB,超过8000行。)
–詹姆斯·斯肯普(James Skemp)
10-10-24在15:38
我很想知道您是否衡量了应用程序性能(我们在这里谈论毫秒级改进?)和应用程序维护(您的工程师是否需要在一个小时内熟悉代码,然后立即进行更改?)之间的权衡?
–丹·埃斯帕萨(Dan Esparza)
2011年8月10日17:25
评论
不要忘记XStreamingElement,msdn.microsoft.com / en-us / library /…。 :)
–托德·怀特
08年11月12日在16:12
对于XmlWriter示例,重要的是要注意,您需要最后关闭writer才能使其正常工作-writer.WriteEndElement()之后需要writer.Close()。
– Marko
2015年3月3日19:39
@Marko说的是真的:正确关闭编写器很重要。还有另一种方法可以代替直接调用writer.Close()。您可以使用以下这样的using语句包装对Create()的调用:using(XmlWriter writer = XmlWriter.Create(Console.Out)){writer.WriteStartElement(“ Foo”); }这里还有XmlWriter的另一个示例(增强了一点):dotnetperls.com/xmlwriter
– Morten
18-10-10在11:28
@Morten确保XmlWriter实现IDisposable,然后using语句是最佳选择。
– Marko
18-10-11在4:01
好的旧XMLDocument拥有了一切。如果要创建XML文档,则简单明了。
– FrenkyB
19年5月23日在1:47