Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Foreach XML节点_C#_Xml_Grid_Coordinates_Xmltextreader - Fatal编程技术网

C#Foreach XML节点

C#Foreach XML节点,c#,xml,grid,coordinates,xmltextreader,C#,Xml,Grid,Coordinates,Xmltextreader,我将二维坐标保存在一个XML文件中,其结构类似于: <?xml version="1.0" encoding="utf-8" ?> <grid> <coordinate time="78"> <initial>540:672</initial> <final>540:672</final> </coordinate> </grid> string initial = "540:67

我将二维坐标保存在一个XML文件中,其结构类似于:

<?xml version="1.0" encoding="utf-8" ?> 
<grid>
<coordinate time="78">
<initial>540:672</initial> 
<final>540:672</final> 
</coordinate>
</grid>
string initial = "540:672";
string final  = "540:672";
int time = 78;

新代码: 我的新代码:

//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++;
};
但现在我得到了这个错误:

“对象引用未设置为对象的实例。”


XML


您可能需要检查像Linq到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
}
这应该比直接使用低级XmlTextReader容易得多

有关Linq到XML的介绍,请参见或(或许多其他地方)


更新:

请尝试此代码-如果它有效,并且您获得了结果列表中的所有坐标,那么Linq到XML代码就可以了:

定义新的帮助器类:

public class Coordinate
{
    public string Time { get; set; }
    public string Initial { get; set; }
    public string Final { get; set; }
}
在主代码中:

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.Attribute("initial").Value,
                                      Final = x.Attribute("final").Value
                                    });
XDocument xdoc=XDocument.Load(“C:\\test.xml”);
IEnumerable cords=xdoc.substands(“坐标”);
var坐标=跳线
.选择(x=>新坐标()
{
时间=x.属性(“时间”).值,
初始=x.属性(“初始”)值,
最终=x.属性(“最终”).值
});

这个列表及其内容看起来怎么样??你能得到你期望的所有坐标吗?

你本可以使用XmlSerialization,用少量的工作将XML变成一个简单的坐标类列表,例如

    public class coordinate
    {
        [XmlAttribute]
        public int time;
        [XmlElement(ElementName="initial")]
        public string initial;
        [XmlElement(ElementName = "final")]
        public string final;

        public coordinate()
        {
            time = 0;
            initial = "";
            final = "";
        }
    }

    public class grid
    {
        [XmlElement(ElementName="coordinate", Type = typeof(coordinate))]
        public coordinate[] list;

        public grid()
        {
            list = new coordinate[0];
        }
    }     
然后在代码中:

XmlReader r = new XmlReader.Create(...);
grid g = (grid) new XmlSerializer(typeof(grid)).Deserialize(r);

附议。我现在尽可能地使用XDocument/XElement,所以更简单。@Gio:
使用System.Xml.Linq在.NET3.5和upI中都有,我只是忘了引用它。谢谢大家。“对象引用未设置为对象的实例。”再次帮助?如果您正在解析小XML,可以使用XDocument。我正在考虑这一点,但我以前从未进行过序列化。@Gio:请参阅我答案中的更新
    public class coordinate
    {
        [XmlAttribute]
        public int time;
        [XmlElement(ElementName="initial")]
        public string initial;
        [XmlElement(ElementName = "final")]
        public string final;

        public coordinate()
        {
            time = 0;
            initial = "";
            final = "";
        }
    }

    public class grid
    {
        [XmlElement(ElementName="coordinate", Type = typeof(coordinate))]
        public coordinate[] list;

        public grid()
        {
            list = new coordinate[0];
        }
    }     
XmlReader r = new XmlReader.Create(...);
grid g = (grid) new XmlSerializer(typeof(grid)).Deserialize(r);