使用C#获取包含Child元素及其值的所有XML节点

时间:2016-05-27 08:20:34

标签: c# .net xml linq-to-xml

我正在使用此XML结构

<root>  
  <StandardValues>    
      <ButtonYES>Ja</ButtonYES>
      <ButtonNO>Nei</ButtonNO>
  <tooltips>
    <tooltipOK>OK</tooltipOK>
    <tooltipCancel>Cancel</tooltipCancel>
  </tooltips>
  </StandardValues>
  <Page1>
    <Key_Head alias="custom value">2011 Applications</Key_Head>
    <Key_Title alias="custom values scsc">Title from 2011</Key_Title>
    <Key_Param1>Parameter value</Key_Param1>
  </Page1>
  <Page2>
      <Page_Head>2011 Applications</Page_Head>
      <page_Title>Title from 2011</page_Title>
      <CustomParam1>Parameter value</CustomParam1>
  </Page2>
</root> 

如何单独找到子节点值作为List。

例如,在这个XML Page1中有3个子节点我只想要这3个名称及其值不需要在结果列表中包含“root”“StandardValues”,“tooltips”,“Page2”,“Page1”等节点。我只希望基本级别的XML元素只有一些值

我尝试过但没有成功

var elements_list = doc.Root
                        .Elements().Where(p=>p.HasElements==false)
                        .Select(d => new
                        {
                            NodeName = (string)d.Name.LocalName,
                            Value = d.Value, // equal to id you are searching for
                            AttributeValue = (d.Attribute("alias") != null) ? 
                                                d.Attribute("alias").Value : ""  
                        }).ToList();

foreach (var s in elements_list)
{
    string ss = string.Format("{0} -  {1} && {2}", s.NodeName, s.Value, s.AttributeValue);
}

1 个答案:

答案 0 :(得分:3)

Elements方法仅返回元素的直接子元素而不返回子元素。

改为使用Descendants

 doc.Root.Descendants().Where(p=>!p.HasElements).Select(....