Сбой XMLReader при отсутствии возвращаемых символов - PullRequest
1 голос
/ 23 ноября 2010

Я использую класс чтения XML, и я сделал следующий пример.

        XmlReader xmlreader = XmlReader.Create("http://adomain/companies.xml");

        while (xmlreader.ReadToFollowing("company"))
        {
            Console.WriteLine("Company {0}",xmlreader.ReadElementContentAsString());

            if (xmlreader.ReadToFollowing("employees"))
            {
                Console.WriteLine("Employees{0}", xmlreader.ReadElementContentAsString());
            }
            Console.WriteLine();
        }

Код работает нормально, когда XML имеет каретку, возвращает результаты, подобные следующим

Компания Web Spiders Co Employees20

Компания Google Employees20000

Компания Саймонс Гремлин Веб Дизайн Employees1

с xml вот так

<? Xml version = "1.0" encoding = "UTF-8"?>

Web Spiders Co
20
Google
20000
Саймонс Гремлин Веб-дизайн
1

однако, когда я удаляю разрывы строк из XML

т.е. <? xml version = "1.0" encoding = "UTF-8"?> Web Spiders Co 20 Google 20000 Simons Gremlin Веб-дизайн 1

затем xmlreader начинает пропускать элементы, и мой набор результатов выглядит совсем иначе

* * +1058 например,

Компания Web Spiders Co Employees20000

Я не очень понимаю, почему это происходит, и почему программа чтения XML ведет себя так.

1 Ответ

2 голосов
/ 24 ноября 2010

Это сбой, потому что когда у вас есть новые строки, есть дополнительный узел типа Whitespace, который заставляет вашу логику работать правильно. Без перевода строки и этих дополнительных узлов, видимых читателем, автоматический переход к следующему элементу, выполняемый ReadElementContentAsString, запутывает вещи.

Это работает для обоих - здесь вы проверяете, находитесь ли вы в нужном месте, прежде чем получать содержимое элемента, и двигаетесь, только если вас там еще нет.

XmlReader xmlreader = XmlReader.Create(@"..\..\test.xml.txt");

while ((xmlreader.Name == "company") || xmlreader.ReadToFollowing("company"))
{
    Console.WriteLine("Company {0}", xmlreader.ReadElementContentAsString());

    if ((xmlreader.Name == "employees") || xmlreader.ReadToFollowing("employees"))
    {
        Console.WriteLine("Employees{0}", xmlreader.ReadElementContentAsString());
    }
    Console.WriteLine();
}
...