Search code examples
c#xmlgridcoordinatesxmltextreader

C# Foreach XML Node


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;

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??