如何将 XElement 插入现有的 xml 文件?

Posted

技术标签:

【中文标题】如何将 XElement 插入现有的 xml 文件?【英文标题】:How can I insert an XElement into an existing xml-file? 【发布时间】:2014-06-17 23:31:20 【问题描述】:

我确实有以下 xml:

<Assembly>
  <Bench>
    <Typ>P1</Typ>
    <DUT>
       <A>6</A>
     </DUT>
  </Bench>
  <Bench>
    <Typ>P2</Typ>
     <DUT>
       <A>6</A>
     </DUT>
  </Bench>
</Assembly>

如何获得对“P2”元素的引用以插入新的 DUT?我尝试了以下代码,这给了我一个错误:

var xElement = xmlDoc.Element("Assembly")
                                .Elements("Bench")
                                .Where(item => item.Attribute("Typ").Value == "P2")
                                .FirstOrDefault();

xElement.AddAfterSelf(new XElement("DUT")); 

提前致谢

【问题讨论】:

你遇到了什么错误? 使用提到的链接***.com/questions/2131061/… @Andrew: xElement 为空 -> 我需要通过哪种方式更改查询?这个例子没有给我正确的解决方案。 【参考方案1】:

Typ 是元素名称,而不是属性。如果您打算在第二个&lt;Bench&gt; 下的现有&lt;DUT&gt; 之后添加新的&lt;DUT&gt; 元素,那么对您尝试过的代码所做的微小更改应该可以工作:

var xElement = xmlDoc.Element("Assembly")
                     .Elements("Bench")
                     .FirstOrDefault(item => item.Element("Typ").Value == "P2");

xElement.AddAfterSelf(new XElement("DUT")); 

【讨论】:

您可以通过将 lambda 合并到 FirstOrDefault 调用中并删除 Where 来缩短它【参考方案2】:

做同样事情的另一种方式,只是为了显示可用的选项。

XElement typ = xmlDoc.Descentants("Typ")
                     .FirstOrDefault(typ => ((string)typ) == "P2");

您可以使用与 har07 相同的 AddAfterSelf.Parent.Add(),如果它在父工作台中的位置无关紧要。 Add 会将其添加为最后一个元素。

typ.Parent.Add(new XElement("DUT"));

【讨论】:

以上是关于如何将 XElement 插入现有的 xml 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Dictionary<XElement,XElement> 转换为 xml 文件?

使用 XElement 保存 XML 文件时,文件中的对齐方式也会发生变化,如何避免?

如何将带有 xml 后代的 XElement 导入 SQL Server

使用格式化和缩进将 XElement 添加到 XML 文件

如何使用 XElement.Parse 解析 XML 而无需查看/将实体更改为字符?

如何使用 XElement 打开 xml?