我需要从多个级别的XML中获取许多节点的值。
有效的XML示例
<?xml version="1.0" encoding="UTF-8"?>
<server>
<id>245723</id>
<name>Server Name</name>
<host>IP Address</host>
<port>Port</port>
<servertype>
<type>Linux</type>
<cpu>Linux</cpu>
<connections>
<connection>
<id>1234</id>
<con_type>new</con_type>
</connection>
<connection>
<id>565665</id>
<con_type>new</con_type>
</connection>
<connection>
<id>908546546466</id>
<con_type>old</con_type>
</connection>
</connections>
</servertype>
</server>
所以基本上我需要在连接节点内访问并运行foreach
。我使用下面的代码将第一级节点值(每个节点)转换为listbox
。效果很好。
用于读取XML的C#代码
string urlAddress = "url to xml file on server";
XDocument itemz = XDocument.Load(urlAddress);
foreach (var item in itemz.Descendants("server"))
{
string name = item.Element("id").Value;
//adding value to a listbox (sample)
lstBox.Items.Add(txtBoxName.Content = item.Element("id").Value);
}
有没有办法使用相同的代码(如此)来获取连接节点下的每个项目(值)。这就像下面的流程示例
server> servertype > connections > foreach connection > get values of connection
它需要像
这样的东西foreach (var item in itemz.Descendants("server")) {
foreach (var item in itemz.Descendants("connections")) {
//foreach connection
foreach (var item in itemz.Descendants("connection")) {
//add connection id to listbox
lstBox.Items.Add(txtBoxName.Content = item.Element("id").Value);
}
}
}
**********编辑**********
使用以下代码将多个值提取到列表框输出
//foreach connection inside connections
//connection node inner node values
string id = item.Element("id").Value);
string type = item.Element("type").Value);
string other = item.Element("other").Value);
string etc = item.Element("etc").Value);
lstBox.Items.Add(txtBoxName.Content = id + type + other + etc;
答案 0 :(得分:1)
要将所有“连接”节点的所有“id”元素值添加到lstBox
,您只需执行以下操作:
XDocument itemz = XDocument.Load(urlAddress);
// ...
foreach (var item in itemz.Descendants("connection"))
lstBox.Items.Add(txtBoxName.Content = item.Element("id").Value);
您无需亲自遍历层次结构,这就是Descendants
将为您做的事情。
虽然txtBoxName.Content = ...
是一个有趣的结构,但其目的并不明确。为什么要重复设置,而不是使用添加的最后一项作为其内容。