[英]XML reading child nodes
I have an XML document and I am trying to get the childnodes of an element called Unit
我有一个XML文档,我试图获取一个名为
Unit
的元素的子节点
My XML Doc is layed out like so: 我的XML Doc就像这样布局:
<Unit>
<id>3</id>
<name>System Information</name>
<description>null</description>
... other ...
</Unit>
This is the code I am using to try and read them. 这是我用来尝试阅读它们的代码。
public void Load()
{
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
XmlDocument xmldoc = new XmlDocument();
XmlNodeList xmlnode;
xmldoc.Load(fs);
xmlnode = xmldoc.GetElementsByTagName("Units");
for (int i = 0; i < xmlnode.Count; i++)
{
string str = string.Format("ID: {0}\r\nName:{0}", xmlnode[i].ChildNodes.Item(0).InnerText, xmlnode[i].ChildNodes.Item(1).InnerText);
MessageBox.Show(str);
}
}
But the problem is, when I try and get them, instead of getting item 0 or item 1, it displays all the items and not the items i have selected. 但问题是,当我尝试获取它们时,它不会显示项目0或项目1,而是显示所有项目而不是我选择的项目。
As I can see from your xml and code. 正如我从你的xml和代码中看到的那样。 You have error in line:
你有错误:
xmlnode = xmldoc.GetElementsByTagName("Units");
change it on: 改变它:
xmlnode = xmldoc.GetElementsByTagName("Unit");
With Linq to Xml you can easily parse your xml into (anonymous) strongly typed objects: 使用Linq to Xml,您可以轻松地将xml解析为(匿名)强类型对象:
public void Load()
{
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
var xdoc = XDocument.Load(fs);
var units = from u in xdoc.Descendants("Unit")
select new {
Id = (int)u.Element("id"),
Name = (string)u.Element("name")
};
foreach(var unit in units)
{
// thanks God for IntelliSense!
MessageBox.Show(String.Format("ID:{0}\r\nName:{1}", unit.Id, unit.Name));
}
}
Well, actually if you only need to show those values in message box, you can even write all code in one line. 实际上,如果您只需要在消息框中显示这些值,您甚至可以将所有代码写在一行中。 But I prefer first approach, when retrieving data and displaying them are separated (ideally in separate methods):
但我更喜欢第一种方法,当检索数据并显示它们时(理想情况下是单独的方法):
XDocument.Load(filePath)
.Descendants("Unit")
.Select(u => String.Format("Id:{0}\nName:{1}", (int)u.Element("id"), (string)u.Element("name"))
.ToList()
.ForEach(MessageBox.Show);
You have a typo in element name: should be Unit
instead of Units
. 元素名称中有拼写错误:应该是
Unit
而不是Units
。
However, have you tried using LINQ to XML instead of XmlDocument
? 但是,您是否尝试过使用LINQ to XML而不是
XmlDocument
?
public void Load()
{
var doc = XDocument.Load(filePath);
foreach(var unit in doc.Descendants("Unit"))
{
string str = string.Format("ID: {0}\r\nName:{0}", unit.Element("id").Value, unit.Element("name").Value);
MessageBox.Show(str);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.