2009-05-25 3 views
3

Как написать или сгенерировать файл 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> 

ответ

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

+0

Действительно симпатичный код. – crauscher

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

Я больше в пользу этого, чем «метод LINQ» (если я могу быть вне линии, чтобы сказать это), поскольку вопрос задает конкретно о том, как написать XML-документ. Если вы хотите запросить и поиграть с XML-документом, то ответ Мехрдада будет более уместным. Кажется, все работает. –

2

Если вы используете рамки .NET 2.0, вы должны использовать XmlWriter класс писать XML, иначе вы можете использовать XmlTextWriter.

Если вы используете .NET 3+, вы можете использовать класс XDocument пространства имен System.Xml.Linq.

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

Именно тот метод, который я использовал бы (pre-LInQ). +1 – Cerebrus

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> 

Я боюсь, что этот ответ будет открыть страшный элемент против дебатов атрибута (который не должен существует, но всегда делает это.)

EDIT: Это не прямой ответ на вопрос; Я чувствую, что он ближе к метакомменту (комментарий об ответах на вопрос). Я не был уверен, где это сказать, если это было даже актуально, но я думаю, что это стоит упомянуть.

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

Смежные вопросы