C# Foreach XML Node

c#, coordinates, grid, xml, xmltextreader

Solution

You might want to check into something like Linq-to-XML:

XDocument coordinates = XDocument.Load("yourfilename.xml");

foreach(var coordinate in coordinates.Descendants("coordinate"))
{
    string time = coordinate.Attribute("time").Value;

    string initial = coordinate.Element("initial").Value;
    string final = coordinate.Element("final").Value;

    // do whatever you want to do with those items of information now
}

That should be a lot easier than using straight low-level XmlTextReader....

See here or here (or a great many other places) for introductions to Linq-to-XML.

UPDATE:

please try this code - if it works, and you get all the coordinates in that resulting list, then the Linq-to-XML code is fine:

Define a new helper class:

public class Coordinate
{
    public string Time { get; set; }
    public string Initial { get; set; }
    public string Final { get; set; }
}

and in your main code:

XDocument xdoc = XDocument.Load("C:\\test.xml");
IEnumerable<XElement> cords= xdoc.Descendants("coordinate");

var coordinates = cords
                  .Select(x => new Coordinate()
                                   {
                                      Time = x.Attribute("time").Value,
                                      Initial = x.Element("initial").Value,
                                      Final = x.Element("final").Value
                                    });

How does this list and its contents look like?? Do you get all the coordinates you're expecting??

Problem

I'm saving 2-dimensional coordinates on an XML file with a structure similar to: ``` <?xml version="1.0" encoding="utf-8" ?> <grid> <coordinate time="78"> <initial>540:672</initial> <final>540:672</final> </coordinate> </grid> ``` I can open the XML file and read it via the XmlTextReader, but how do I loop through the coordinates specifically to retrieve both the time attribute and data between the initial and final nodes in some format similar to: ``` string initial = "540:672"; string final = "540:672"; int time = 78; ``` New Code: My New Code: ``` //Read the XML file. XDocument xmlDoc = XDocument.Load("C:\\test.xml"); foreach (var coordinate in xmlDoc.Descendants("coordinate")) { this.coordinates[this.counter][0] = coordinate.Attribute("time").Value; this.coordinates[this.counter][1] = coordinate.Element("initial").Value; this.coordinates[this.counter][2] = coordinate.Element("final").Value; this.counter++; }; ``` but now I get this error: "Object reference not set to an instance of an object." XML ``` <?xml version="1.0" encoding="utf-8"?> <grid> <coordinate time="62"> <initial>540:672</initial> <final>540:672</final> </coordinate> ... <coordinate time="46"> <initial>176:605</initial> <final>181:617</final> </coordinate> </grid> ``` Skipped a few coordinate tags to fit, but they all had the time attribute and initial/final subtags. Globals ``` uint counter = 0; // Coordinates to be retrieved from the XML file. string[][] coordinates; ```

Original source