【问题标题】:Matching XElements in an XDocument against a list of names将 XDocument 中的 XElements 与名称列表匹配
【发布时间】:2014-08-14 10:14:09
【问题描述】:

我已将类似于以下内容的 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

【问题讨论】:

    标签: c# xml linq xml-parsing linq-to-xml


    【解决方案1】:

    首先让您的 XPath 停止在 &lt;schedule&gt; 元素而不是 &lt;request&gt; 因为您将在此处删除 &lt;schedule&gt; 的子元素:

    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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-08
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 2011-04-01
      • 2014-07-14
      • 1970-01-01
      相关资源
      最近更新 更多