Как написать или сгенерировать файл XML - PullRequest
3 голосов
/ 25 мая 2009

Как написать или сгенерировать файл XML, используя C #, чтобы получить результат ниже?

<?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 ]

10 голосов
/ 25 мая 2009
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);
5 голосов
/ 25 мая 2009

Довольно прямой путь может быть таким:

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
}
3 голосов
/ 25 мая 2009

Я думаю, что-то вроде этого:

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();  
2 голосов
/ 25 мая 2009

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

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

1 голос
/ 26 мая 2009
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 голосов
/ 26 мая 2009

Вы также можете посмотреть привязку данных 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());

Взгляните на ". Более внимательное рассмотрение XML Binding Data "

.

Вот также хороший список инструментов связывания данных xml

0 голосов
/ 26 мая 2009

Пара баллов за предоставленные ответы. Для документа 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>

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

РЕДАКТИРОВАТЬ: Это не прямой ответ на вопрос; Я чувствую, что это ближе к метакомментарию (комментарий об ответах на вопрос). Я не был уверен, где его поставить, если оно вообще было актуально, но думаю, стоит упомянуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...