如何编写或生成XML文件

时间:2009-05-25 17:52:11

标签: c# .net xml

如何使用C#编写或生成XML文件以获得下面的结果?

<?xml version="1.0" encoding="UTF-8"?>
<pages>
<page name="Page Name 1" url="/page-1/" />
<page name="Page Name 2" url="/page-2/" />
<page name="Page Name 3" url="/page-3/" />
<page name="Page Name 4" url="/page-4/" />
</pages>

7 个答案:

答案 0 :(得分:10)

using System.Linq;
using System.Xml;
using System.Xml.Linq;

// ...

using (var writer = XmlWriter.Create("output.xml"))
     new XDocument(
        new XDeclaration("1.0", "UTF-8", null),
        new XElement("pages",
            Enumerable.Range(1, 4)
                .Select(i => new XElement("page",
                                  new XAttribute("name", "Page Name " + i),
                                  new XAttribute("url", "/page-" + i + "/"))))
     ).WriteTo(writer);

答案 1 :(得分:5)

一种相当直接的方式可能是这样的:

XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.Indent = true;
using (XmlWriter writer = XmlWriter.Create(@"c:\path\file.xml", settings))
{

    writer.WriteStartElement("pages");

    for (int i = 1; i < 5; i++)
    {
        writer.WriteStartElement("page");
        writer.WriteAttributeString("name", "Page Name " + i.ToString());
        writer.WriteAttributeString("url", string.Format("/page-{0}/", i));
        writer.WriteEndElement(); // page
    }
    writer.WriteEndElement(); // pages
}

答案 2 :(得分:3)

我猜是这样的:

System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(Server.MapPath("pages.xml"), System.Text.Encoding.UTF8);

        writer.WriteStartDocument();
        writer.WriteStartElement("pages");

        writer.WriteStartElement("page");
        writer.WriteAttributeString("name", "Page name 1");
        writer.WriteAttributeString("url", "Page url 1");
        writer.WriteEndElement();

        writer.WriteStartElement("page");
        writer.WriteAttributeString("name", "Page name 2 ");
        writer.WriteAttributeString("url", "Page url 2");
        writer.WriteEndElement();

        writer.WriteStartElement("page");
        writer.WriteAttributeString("name", "Page name 3");
        writer.WriteAttributeString("url", "Page url 3");
        writer.WriteEndElement();

        writer.WriteEndElement();
        writer.WriteEndDocument();
        writer.Close();  

答案 3 :(得分:2)

如果您使用的是.NET framework 2.0,则应使用XmlWriter类编写XML,否则可以使用XmlTextWriter

如果您使用的是.NET 3+,则可以使用System.Xml.Linq命名空间的XDocument类。

答案 4 :(得分:1)

using System.Xml;
//...
XmlDocument xmldoc = new XmlDocument();
XmlElement pages = xmldoc.CreateElement("pages");
XmlElement page = null;

for(int i = 1; i <= 4; i++)
{
    page = xmldoc.CreateElement("page");
    page.SetAttribute("name", "Page Name " + i);
    page.SetAttribute("url", "/page-" + i + "/");
    pages.AppendChild(page);
}

xmldoc.AppendChild(xmldoc.CreateXmlDeclaration("1.0", "UTF-8", null));
xmldoc.AppendChild(pages);
xmldoc.Save("output.xml");

答案 5 :(得分:0)

对答案给出了几点意见。对于那个大小的XML文档,XDocument处理它的效率非常低。至少,我了解XDocument应该用于什么。如果您在内存中处理大型文档并且想要使用LINQ查询它们,那么XmlDocument / XDocument就是前进的方法。如果我错了,请纠正我并接受我的道歉。

其次,根据我的理解,您的XML结构是错误的。如果我没有这个权利,请纠正我,但属性是描述元素值是什么的元数据。它不能用作价值本身。对于您的情况,您的结构应该类似..

<pages>
    <page>
        <name href="url">Page Name 1</name>
    </page>
</pages>

或者如果你想成为真正的肛门

<pages>
    <page>
        <name>Page Name 1
        <url>http://page/</url>
    </page>
</pages>

我担心这个答案会打开可怕的元素与属性的争论(不应该存在,但总会存在。)

编辑:这不是问题的直接答案;我觉得它更接近一个元素(关于问题答案的评论)。如果它甚至相关,我不知道该把它放到哪里,但我认为值得一提。

答案 6 :(得分:0)

您还可以查看XML数据绑定。这种方法可以为您提供看起来更像这样的代码。

Pages pages = new Pages();
for(int i=1; i<=4;i++)
{
    Page p = new Page();
    p.name = "Page Name " + i;
    p.url = "/page-" + i + "/";
    pages.Pages.Add(p);
}
Console.Write(pages.ToXml());

查看“A closer look at XML Data Binding

这也是一个很好的list of xml data binding tools