如何在c#中生成有效的XML ?


当前回答

对于简单的情况,我还建议查看XmlOutput——用于构建Xml的流畅接口。

XmlOutput非常适合用于创建具有可读和可维护代码的简单Xml,同时生成有效的Xml。最初的帖子有一些很好的例子。

其他回答

XmlWriter是编写良好XML的最快方法。XDocument, XMLDocument和其他一些也很好,但没有为编写XML进行优化。如果希望尽可能快地编写XML,那么肯定应该使用XmlWriter。

如上所述。

我使用stringbuilder.append()。

非常简单,然后可以使用xmldocument。加载(stringbuilder对象作为参数)。

你可能会发现自己在使用字符串。Concat,但这是一种非常直接的方法。

我认为这个资源应该足以满足适度的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);
            }
    }
}

}
}

对于简单的情况,我还建议查看XmlOutput——用于构建Xml的流畅接口。

XmlOutput非常适合用于创建具有可读和可维护代码的简单Xml,同时生成有效的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并没有获得多少好处)。