Как генерировать и потреблять XML в C #? - PullRequest
3 голосов
/ 28 апреля 2010

Я некоторое время не работал с XML, может кто-нибудь опубликовать синтаксис, необходимый для построения и сохранения структуры узла xml, которая напоминает структуру дерева, созданную рекурсивной функцией.

в основном у меня есть рекурсивная функция, которая сохраняет данные, найденные на странице (URL), а затем следует за каждым URL, найденным на этой странице, и делает то же самое с ней Чтобы проверить это, я хочу, чтобы вывод в виде XML-файла на диск, чтобы я мог видеть, как он делает свою рекурсию и синтаксический анализ.

код у меня ниже. пожалуйста, добавьте к нему необходимые вызовы xml, необходимые для создания структуры xml, подобной той, что я показываю ниже. (пожалуйста, включите полное пространство имен, чтобы я мог видеть, где для этого нужны объекты в .net.)

page1.htm имеет 2 ссылки:

<a href=page1_1.htm>
<a href=page1_2.htm>

page1_1.htm имеет 2 ссылки

<a href=page1_1_a.htm> (this then will have some links also)
<a href=page1_1_b.htm> (this then will have no more links on it - dead end)

XML должен сделать что-то вроде этого:

<node url=page1.htm>
    ...<node url=page1_1_a.htm>
       ......    <node url="xxx.htm"/>
       ......    <node url="yyy.htm".>
    ... </node>
    ...<node url=page1_1_b.htm />

</node>

Ответы [ 6 ]

2 голосов
/ 28 апреля 2010

Для запуска попробуйте следующее пространство имен, в нем есть все классы для генерации и манипуляции xml

  • Пространство имен System.Xml

    XmlTextWriter xWriter = new XmlTextWriter(Console.Out);    
    xWriter.WriteStartElement("prefix", "Element1", "namespace"); 
    xWriter.WriteStartAttribute("prefix", "Attr1", "namespace1"); 
    xWriter.WriteString("value1"); 
    xWriter.WriteStartAttribute("prefix", "Attr2", "namespace2"); 
    xWriter.WriteString("value2"); 
    xWriter.Close();
    

Если вы знакомы с LINQ, взгляните на

вот образец

XDocument srcTree = new XDocument(
    new XComment("This is a comment"),
    new XElement("Root",
        new XElement("Child1", "data1"),
        new XElement("Child2", "data2"),        
    )
);

XDocument doc = new XDocument(
    new XComment("This is a comment"),
    new XElement("Root",
        from el in srcTree.Element("Root").Elements()
        where ((string)el).StartsWith("data")
        select el
    )
);
Console.WriteLine(doc);
1 голос
/ 28 апреля 2010

У меня есть этот XML-документ, который будет сгенерирован на лету во время выполнения.

<?xml version="1.0" encoding="utf-8"?>
<wap-provisioningdoc>
  <characteristic type="BOOTSTRAP">
    <parm name="NAME" value="SYNCSETTINGS" />
  </characteristic>
  <characteristic type="APPLICATION">
    <parm name="APPID" value="w5" />
    <parm name="TO-NAPID" value="INTERNET" />
    <parm name="NAME" value="SYNCSETTINGS" />
    <parm name="ADDR" value="http://syncserver/sync" />
    <characteristic type="RESOURCE">
      <parm name="URI" value="pb" />
      <parm name="NAME" value="Contacts DB" />
      <parm name="AACCEPT" value="text/x-vcard" />
    </characteristic>
    <characteristic type="RESOURCE">
      <parm name="URI" value="cal" />
      <parm name="NAME" value="Calendar DB" />
      <parm name="AACCEPT" value="text/x-vcalendar" />
    </characteristic>
    <characteristic type="RESOURCE">
      <parm name="URI" value="notes" />
      <parm name="NAME" value="Notes DB" />
      <parm name="AACCEPT" value="text/plain" />
    </characteristic>
    <characteristic type="APPAUTH">
      <parm name="AAUTHNAME" value="username" />
      <parm name="AAUTHSECRET" value="password" />
    </characteristic>
  </characteristic>
</wap-provisioningdoc>

Вот так я сгенерировал этот XML-документ, используя C # 3.0 и Linq.

public string CreateOTAXmlFile(string Username, string Password)
    {
        var ota = new XDocument(
                    new XElement("wap-provisioningdoc",
                        new XElement("characteristic", new XAttribute("type", "BOOTSTRAP"),
                            new XElement("parm", new XAttribute("name", "NAME"), new XAttribute("value", "SYNCSETTINGS"))
                                    ),
                        new XElement("characteristic", new XAttribute("type", "APPLICATION"),
                            new XElement("parm", new XAttribute("name", "APPID"), new XAttribute("value", "w5")),
                            new XElement("parm", new XAttribute("name", "TO-NAPID"), new XAttribute("value", "INTERNET")),
                            new XElement("parm", new XAttribute("name", "NAME"), new XAttribute("value", "SYNCSETTINGS")),
                            new XElement("parm", new XAttribute("name", "ADDR"), new XAttribute("value", "http://syncserver/sync")),
                            new XElement("characteristic", new XAttribute("type", "RESOURCE"),
                                new XElement("parm", new XAttribute("name", "URI"), new XAttribute("value", "pb")),
                                new XElement("parm", new XAttribute("name", "NAME"), new XAttribute("value", "Contacts DB")),
                                new XElement("parm", new XAttribute("name", "AACCEPT"), new XAttribute("value", "text/x-vcard"))
                                        ),
                            new XElement("characteristic", new XAttribute("type", "RESOURCE"),
                                new XElement("parm", new XAttribute("name", "URI"), new XAttribute("value", "cal")),
                                new XElement("parm", new XAttribute("name", "NAME"), new XAttribute("value", "Calendar DB")),
                                new XElement("parm", new XAttribute("name", "AACCEPT"), new XAttribute("value", "text/x-vcalendar"))
                                        ),
                            new XElement("characteristic", new XAttribute("type", "RESOURCE"),
                                new XElement("parm", new XAttribute("name", "URI"), new XAttribute("value", "notes")),
                                new XElement("parm", new XAttribute("name", "NAME"), new XAttribute("value", "Notes DB")),
                                new XElement("parm", new XAttribute("name", "AACCEPT"), new XAttribute("value", "text/plain"))
                                        ),
                            new XElement("characteristic", new XAttribute("type", "APPAUTH"),
                                new XElement("parm", new XAttribute("name", "AAUTHNAME"), new XAttribute("value", Username)),
                                new XElement("parm", new XAttribute("name", "AAUTHSECRET"), new XAttribute("value", Password))
                                        )
                                    )
                                )
                            );

        ota.Save(Server.MapPath("~/OTA/") + Username + ".xml");
        return (ota.ToString());

    }
1 голос
/ 28 апреля 2010

Другой вариант - использовать Сериализация XML , чтобы выполнить преобразование для вас, если у вас уже есть дерево объектов.

1 голос
/ 28 апреля 2010

Google - твой друг!

Теперь немного почитайте!

XDocument

0 голосов
/ 28 апреля 2010

Если вы используете 3.5 или выше, используйте самый последний и самый лучший класс XDocument Это заставит тебя влюбиться!

0 голосов
/ 28 апреля 2010

Объекты, которые вы хотите, находятся в пространстве имен System.Xml.

XmlDocument doc = new XmlDocument();

doc.AppendChild(CreateNodeElement(doc, rootNode));

doc.Save(fileName);

...

private XmlElement CreateNodeElement(XmlDocument doc, Node node)
{
    XmlElement output = doc.CreateElement("node");

    output.Attributes.Append(doc.CreateAttribute("url")).Value = node.Url;

    foreach(Node child in node.Links)
    {
        output.AppendChild(CreateNodeElement(doc, child));
    }

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