Используя C#, как я могу отображать XML построчно?

Hy,

У меня есть например этот XML:

<books>
  <book1 name="Cosmic">
    <attribute value="good"/>
  </book1>
</books>  

Как я могу отображать его в элементе управления listBox построчно, чтобы в конечном итоге это был список с 5 строками в этом случае?

В данный момент я пишу XML с использованием LINQ to XML следующим образом:

 foreach (XElement element in document.DescendantNodes())
   {
     MyListBox.Items.Add(element.ToString());
   }

Но окончательный результат помещает каждый узел xml в один элемент списка (включая дочерние узлы).

У кого-нибудь есть идеи, как можно построчно помещать xml в элементы списка?

Благодарю.

Джефф

3 ответа

Решение

Простое решение будет использовать рекурсивную функцию, подобную следующей:

public void FillListBox(ListBox listBox, XElement xml)
{
    listBox.Items.Add("<" + xml.Name + ">");
    foreach (XNode node in xml.Nodes())
    {
        if (node is XElement)
            // sub-tag
            FillListBox(listBox, (XElement) node);
        else
            // piece of text
            listBox.Items.Add(node.ToString());
    }
    listBox.Items.Add("</" + xml.Name + ">");
}

Конечно, этот будет печатать только имена тегов (например, <book1> в вашем примере) а не атрибуты (name="Cosmic" так далее.). Я уверен, что вы можете положить их в себя.

Если вы хотите отобразить ваш необработанный XML в списке, используйте текстовый поток для чтения ваших данных.

using(StreamReader re = File.OpenText("Somefile.XML"))
{
  string input = null;
  while ((input = re.ReadLine()) != null)
  {
    MyListBox.Items.Add(input);
  }
}

Джефф, может быть, было бы намного проще реализовать (и читать / поддерживать) с простым TextReader.ReadLine()? Я не знаю, чего вы пытаетесь достичь, только предложение.

Другие вопросы по тегам