Youeee
Youeee

Reputation: 393

XMLReader failing when there are no return characters

I am using XML reader class and I have made the folowing example.

        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();
        }

The code works fine when the XML has carriage returns results like the following

Company Web Spiders Co Employees20

Company Google Employees20000

Company Simons Gremlin Web Design Employees1

with xml like this

<?xml version="1.0" encoding="UTF-8"?>
<companies>
<company>Web Spiders Co</company>
<employees>20</employees>
<company>Google</company>
<employees>20000</employees>
<company>Simons Gremlin Web Design</company>
<employees>1</employees>
</companies>

however when I remove the linebreaks from the XML

i.e. <?xml version="1.0" encoding="UTF-8"?> <companies> <company>Web Spiders Co</company> <employees>20</employees> <company>Google</company> <employees>20000</employees> <company>Simons Gremlin Web Design</company> <employees>1</employees> </companies>

then the xmlreader starts to skip over elements and my result set looks very different

e.g.

Company Web Spiders Co Employees20000

I don't really understand why this is happening, and why the XML reader behaves in this way.

Upvotes: 1

Views: 1035

Answers (1)

Steve Townsend
Steve Townsend

Reputation: 54158

This is failing because when you have the newlines, there is an extra node of type Whitespace, which makes your logic work correctly. Without the newlines and these extra nodes seen by the reader, the auto-skipping to next element done by the ReadElementContentAsString messes things up.

This works for both - here, you check whether you are already at the desired spot before getting the element content, and only move if you are not already there.

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();
}

Upvotes: 2

Related Questions