C#Foreach XML节点
我将二维坐标保存在一个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 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);