首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LINQ删除XML中的所有节点,其中值是特定的

使用LINQ删除XML中的所有节点,其中值是特定的
EN

Stack Overflow用户
提问于 2022-11-16 09:52:13
回答 1查看 30关注 0票数 0

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

代码语言:javascript
复制
<?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>

我希望删除所有<FlashItem></FlashItem>节点,其中<Step>值与某些值相等。我尝试过LINQ,但是查询的结果总是null

代码语言:javascript
复制
XDocument xmlDoc = XDocument.Load("test.xml");

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

在C#中有这样的建议吗?

更新:

代码语言:javascript
复制
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中,但是当我尝试删除时,我会得到一个空引用异常。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-16 10:45:47

你的代码确实有效..。但是,您没有删除要查找的父节点--您正在移除步骤节点本身。

试试看:

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74458371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档