C # simple xml reader skips every other element

Hello everyone. I tried to write a simple xml reader, but found that it inadvertently skips all the other elements in the XML file.

I guess I tell him to move on to the next element twice, but I'm not sure what is happening or what the decision is.

any help would be greatly appreciated :)

Here is sample code and sample xml file

public LevelLoader(string theLevelFile ,ContentManager theContent)
    {
        XmlTextReader reader = new XmlTextReader(theLevelFile);
        while (reader.Read())
        {               
            if (reader.NodeType == XmlNodeType.Element)
            {
                switch (reader.Name)
                {
                    case "tilerow":
                    {                            
                        currentRow = currentRow + 1;
                        Console.WriteLine("row found");
                        currentCol = 0;
                        break;
                    }

                    case "tilecol":
                    {
                        Console.WriteLine("col found");                                                                                                                         
                        currentTexture = reader.ReadElementContentAsFloat();                          
                        currentCol = currentCol + 1;
                        break;
                    }
                }
            }
        }
    }

xml sample

<tilerow>
<tilecol>1</tilecol><tilecol>2</tilecol><tilecol>3</tilecol><tilecol>4</tilecol><tilecol>5</tilecol><tilecol>6</tilecol><tilecol>7</tilecol><tilecol>8</tilecol><tilecol>9</tilecol><tilecol>10</tilecol>
</tilerow>
+3
source share
3 answers

Read() Column, "Text", EndElement. ReadElementContentAsFloat, , Read() "". EndElement, 2, 4,...

...

case "tilecol": 
{ 
Console.WriteLine("col found");
reader.Read();
float.TryParse(reader.Value, out currentTexture);
currentCol = currentCol + 1;
break;
} 
+3

: http://msdn.microsoft.com/en-us/library/ms223980.aspx

, ReadElementContentAsFloat , "" . Read() .

, :

while (!reader.EOF)
{
    bool needToRead = true;
    if (reader.NodeType == XmlNodeType.Element)
    {
        switch (reader.Name)
        {
            case "tilerow":
                currentRow = currentRow + 1;
                Console.WriteLine("row found");
                currentCol = 0;
                break;

            case "tilecol":
                Console.WriteLine("col found");                                                                                                                         
                currentTexture = reader.ReadElementContentAsFloat();                          
                currentCol = currentCol + 1;
                needToRead = false;
                break;
        }
    }
    if (needToRead)
        reader.Read();
}
+2

@Shadow Wizard ReadXml TileRow

public void ReadXml(XmlReader reader)
{
    reader.Read();
    do
    {
        if (!XmlNodeType.Element.Equals(reader.NodeType))
        {
            if (!XmlNodeType.EndElement.Equals(reader.NodeType))
            {
                log.error(reader.NodeType + " is an unknown NodeType for " + this.GetType());
            }
            // return while further reading would move the reader position to another / outer element and will lead to skipped elements in parser
            return;
        }
        switch (reader.Name)
        {
            case "tilecol":
                col = reader.ReadElementContentAsFloat();
                break;

             default:
                log.error(reader.Name + " is not a valid XMLElement for " + this.GetType());
                reader.Read();
                break;
        }
    }
    while (!reader.EOF);
 }

:

public void WriteXml(XmlWriter writer)
{
    writer.WriteElementString("tilecol", col.ToString());
}

TileRow XMLElement

[XmlElement]
public TileRow tileRow { get; set; }
0

Source: https://habr.com/ru/post/1773494/


All Articles