XmlReader.ReadToNextSibling не работает - PullRequest
3 голосов
/ 02 ноября 2011

Я пытаюсь прочитать документ xml, но XmlReader.ReadToNextSibling не работает, как указано в этой документации MSDN

Вот пример консоли:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;

namespace ConsoleTestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string xmlText = "<xmlRoot><group><item>Item 1</item><item>Item 2</item></group><group><item>Item 3</item><item>Item 4</item></group></xmlRoot>";

            using (XmlReader reader = XmlReader.Create(new StringReader(xmlText)))
            {
                reader.ReadToFollowing("item");
                do
                {
                    Console.WriteLine("Item: {0}", reader.ReadInnerXml());
                } while (reader.ReadToNextSibling("item"));
            }

            Console.WriteLine("Press any key to continue...");
            Console.Read();
        }
    }
}

Это выводит только один элемент:

Элемент: Элемент 1

Кто-нибудь знает, как я могу заставить это работать?

Пожалуйста, не предлагайте использовать модель DOM (XmlDocument). Я не могу, потому что эти xml-файлы взяты из разных источников и могут иметь много разных пространств имен, и это очень хлопотно. Мне нужно, чтобы это заработало.

1 Ответ

5 голосов
/ 02 ноября 2011

Это потому, что ReadInnerXml также продвигает читателя.Поэтому, когда вы доберетесь до своего первого ReadToNextSibling, вы окажетесь на пункте 2, и следующего брата нет.

Этот код будет читать оба ваших элемента:

string xmlText = "<xmlRoot><group><item>Item 1</item><item>Item 2</item></group><group><item>Item 3</item><item>Item 4</item></group></xmlRoot>";

using (XmlReader reader = XmlReader.Create(new StringReader(xmlText)))
{
    reader.ReadToFollowing("item");
    do
    {
        Console.WriteLine("Item: {0}", reader.ReadInnerXml());
    } while (reader.Name == "item");
}   
...