2009-05-25 97 views
3

如何使用C#编写或生成XML文件以获取下面的结果?如何编写或生成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> 

回答

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); 
+0

漂亮的代码:P ~~~ – jgallant 2009-05-25 23:09:35

+0

真漂亮代码。 – crauscher 2009-05-27 10:27:42

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(); 
+0

由于该问题特别针对如何编写XML文档,我比“LINQ方法”(如果我可以脱口而出)更赞成这一点。如果你想查询和使用XML文档,那么Mehrdad的答案会更加相关。我猜想可以工作。 – 2009-05-25 22:09:20

2

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

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

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 
} 
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> 

恐怕这个答案将开辟可怕的元素VS属性辩论(这不该不存在但始终如此。)

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

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"); 
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