2009-05-25 101 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