【问题标题】:c# linq to xml: add child element to specific parent element based upon valuec# linq to xml:根据值将子元素添加到特定的父元素
【发布时间】:2016-04-06 04:47:57
【问题描述】:

我正在通过 LINQ to XML 在 c# 中制作一个 XML 配置文件编辑器。我在插入存在特定父值的子节点时遇到了困难。

我现在的代码:

var xdoc = XElement.Load(config.ConfigPath);
....
xdoc.Descendants("grandparent")
.Where(a => a.Element("parent")
.Value == "targetvalue").FirstOrDefault()
.Add(new XElement("grandchild", grandchildvalue));  

产量:

<grandparent>
     <parent>
     <grandchild>

而不是预期的:

<grandparent>
     <parent>
          <grandchild>

在代码中的这个特定点,仅创建了祖父节点和父节点,并且正在创建孙元素及其各自的值。如何使孙元素从属于父元素?

提前感谢您的任何帮助。

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    您的 LINQ 应该返回 &lt;parent&gt; 元素:

    xdoc.Descendants("grandparent")
        .Elements("parent")
        .FirstOrDefault(o => (string)o == "targetvalue")
        .Add(new XElement("grandchild", grandchildvalue));  
    

    【讨论】:

    • 感谢您的回复。不幸的是,这种方法仍然会产生像以前一样的输出,其中父元素和孙元素列在同一行/级别上。
    【解决方案2】:

    感谢您的回复。您的回复确实会产生正确的结果,修改为:

     xdoc.Descendants("grandparent")
        .Descendants("parent")
        .Where(a => a.Attribute("name").Value == parentvalue).FirstOrDefault()                                                                            
        .Add(new XElement("grandchild", grandchildvalue));
    

    事实证明,我之前的 xml 结构是错误的。在给父节点一个值而不是一个属性时,我得到的输出如下:

    <parent>parentvalue</parent><grandchild>grandchildvalue</grandchild>
    

    他们在同一级别。通过允许将孙子的值设置为从属于父级的属性设置父级的值。感谢您帮助我找到这个愚蠢的初学者错误!

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多