将XDocument中的xelement与名称列表进行匹配

本文关键字:列表 XDocument 中的 xelement | 更新日期: 2023-09-27 18:18:02

我已经将类似于下面的Xml加载到一个XDocument

<requestlist>
  <request name="Apple" jobtype="radio">
    <schedule intervalminutes="1440" daily="true" updateDateTime="2014-08-07T15:43:00Z">
      <channel>someData/channel>
      <signal>someData</readysignal>
      <frequency>someData</frequency>
    </schedule>
    <file>someData</file>
    <file>someData</file>
  </request>
  </requestlist>

我现在想添加第二个请求,从第一个请求中获取一些信息,并删除一些不需要的元素,例如

 <request name="newBanana">
    <schedule intervalminutes="1440" daily="true" updateDateTime="2014-08-07T15:43:00Z">
    </schedule>
    <file>someData</file>
</request>

是否有一种简单的方法,我可以通过匹配一个列表来删除使用Linq的元素例如

using System.Xml.XPath;
XDocument configXml = XDocument.Parse(theXml)
var oldRequest = configXml.XPathSelectElement(@"/requestlist/request[@name=""Apple""]");
var nodesToRemove = new List<XName>() {"channel", "signal", "radio"};
var newRequest = oldRequest.Elements().Select(e => e.Name).Intersect(nodesToRemove); //OR something

将XDocument中的xelement与名称列表进行匹配

首先让您的XPath停止在<schedule>元素而不是<request>,因为您将在这里删除<schedule>的子元素:

var oldRequest = doc.XPathSelectElement(@"/requestlist/request[@name='Apple']/schedule");

那么是的,你可以使用简单的LINQ来删除列表中与名字匹配的元素:

var nodesToRemove = new List<XName>() { "channel", "signal", "radio" };
oldRequest.Elements()
          .Where(o => nodesToRemove.Contains(o.Name))
          .Remove();