多级XML ForEach WPF

时间:2015-05-10 08:03:51

标签: c# xml wpf foreach

我需要从多个级别的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;

1 个答案:

答案 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 = ...是一个有趣的结构,但其目的并不明确。为什么要重复设置,而不是使用添加的最后一项作为其内容。