.net 使用LINQ从XML中删除值特定所有节点

iaqfqrcu  于 2022-11-19  发布在  .NET
关注(0)|答案(1)|浏览(150)

我有一个XMl文件,它具有以下结构:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FlashMemory>
    <FlashItems>
        <FlashItem>
            <Keyword KID="1234">XY</Keyword>
            <Header Version="1">XY</Header>
            <Gap DivisibleBy="8">XY</Gap>
            <Datatype DID="12345">XY</Datatype>
            <Length>2</Length>
            <ProductionSteps>
                <ProductionStep>
                    <Step>XY</Step>
                    <Source>XY</Source>
                    <Value>XY/Value>
                    <DocTarget>
                        <Target>None</Target>
                    </DocTarget>
                </ProductionStep>
            </ProductionSteps>
        </FlashItem>
        <FlashItem>
        .
        .
        .
        </FlashItem>
    </FlashItems>
</FlashMemory>

我想删除<Step>值等于某个值的所有<FlashItem></FlashItem>节点。我尝试使用LINQ,但查询的结果总是null

XDocument xmlDoc = XDocument.Load("test.xml");

xmlDoc.Descendants("FlashItems")
      .Elements("FlashItem")
      .Elements("ProductionSteps")
      .Elements("ProductionStep")
      .Elements("Step")
      .Where(x => x.Value == "testvalue").Remove();

在C#中有什么建议吗?
更新:

var nodes = xmlDoc.Descendants("FlashItem");

var x = (from element in nodes 
         where element.Element("ProductionSteps")
                      .Element("ProductionStep")
                      .Element("Step").Value == "HecuProduction" 
         select element);

foreach (var query in x)
{
   query.Element("Flashitem").Remove();              
}

在本例中,选择是有效的,我需要删除的所有节点都在x中,但是当我尝试删除时,我得到了一个空引用异常。

s8vozzvw

s8vozzvw1#

您的代码实际上是有效的...但是您没有删除要访问的父节点-您删除的是步骤节点本身。
给予看:

using System.Xml.Linq;

XDocument xmlDoc = XDocument.Load("./test.xml");

var nodesToRemove = xmlDoc.Descendants("FlashItems")
      .Elements("FlashItem")
      .Elements("ProductionSteps")
      .Elements("ProductionStep")
      .Elements("Step")
      .Where(x => x.Value == "testvalue");

foreach (var node in nodesToRemove) {
    node.Parent.Parent.Parent.Remove();
}

相关问题