Ошибка XMLReader, когда нет возвращаемых символов

Я использую класс чтения 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 Сотрудники20

Компания Google Сотрудники20000

Компания Simons Gremlin Web Design Сотрудники1

с xml вот так

‹?xml version=1.0 encoding=UTF-8?›
‹компании›
‹company›Web Spiders Co‹/company›
‹employees›20‹/employees›
‹company›Google ‹/company›
‹employees›20000‹/employees›
‹company›Simons Gremlin Web Design‹/company›
‹employees›1‹/employees›
‹/companies›

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

т.е. ‹?xml version=1.0 encoding=UTF-8?› ‹companies› ‹company›Web Spiders Co‹/company› ‹employees›20‹/employees› ‹company›Google‹/company› ‹employees›20000‹/employees › ‹компания›Simons Gremlin Web Design‹/компания› ‹сотрудники›1‹/сотрудники› ‹/компании›

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

e.g.

Компания Web Spiders Co Сотрудники20000

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


person Youeee    schedule 23.11.2010    source источник


Ответы (1)


Это не работает, потому что когда у вас есть новые строки, есть дополнительный узел типа 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();
}
person Steve Townsend    schedule 23.11.2010