【问题标题】:Get all XML Nodes with Child elements and their values in C#在 C# 中获取所有带有子元素的 XML 节点及其值
【发布时间】:2016-05-27 08:20:33
【问题描述】:

我正在使用这个 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);
}

【问题讨论】:

  • 顺便说一句,(d.Attribute("alias") != null) ? d.Attribute("alias").Value : "" 可以写成(string)d.Attribute("alias") ?? ""
  • 也想包含第 2 页的子节点 .. 只有每个节点的子节点
  • @CharlesMager 我将节点名称保留为属性值,如果它为 null 这就是为什么我保留这样的代码
  • @JibinMathew 我建议的代码返回的结果完全相同?

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


【解决方案1】:

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

改用Descendants

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

【讨论】:

  • 完美做到了。但是我有一个带有粗体值的节点,没有像 Parametebold paramr value 这样的 CData 并且此代码也返回该 标记。有什么方法可以避免这种情况吗?目前我将 作为 2 个节点
  • @JibinMathew 我已经测试了您在评论中提供的字符串。你确定你得到CustomParamb 节点吗?在我这边——我只得到b——这完全符合最初的目标“只得到没有孩子的“叶子”节点”
  • 抱歉缺乏观察。此处相同,只有 没有 CustomParam。此外,当我添加 CData 时,一切都很好。我认为使用 cData 是 xml 方式,但我对 xml 文件没有太多控制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 2021-12-24
相关资源
最近更新 更多