XML/C#:删除具有特定属性的元素的最简单方法

XML/C#: Eeasiest way to delete elements with a specific attribute

Xml:

<?xml version="1.0" encoding="UTF-8"?>
<Information>
  <Group Title="Abc">
    <Item Title="12" Visible="False">xxx</Item>
    <Item Title="34">xxx</Item>
  </Group>
  <Group Title="Def" Visible="False">
    <Item Title="56">xxx</Item>
  </Group>
  <Group Title="Ghi">
    <Item Title="78">xxx</Item>
    <Item Title="9">xxx</Item>
    <Item Title="10" Visible="False">xxx</Item>
  </Group>
</Information>

想要删除所有组(不仅是第一个或一个!)和所有(不仅是第一个或一个!)Visible=False 的项目,这让我很不爽...

有了上面的ex,我想要这个结果:

<?xml version="1.0" encoding="UTF-8"?>
<Information>
  <Group Title="Abc">
    <Item Title="34">xxx</Item>
  </Group>
  <Group Title="Ghi">
    <Item Title="78">xxx</Item>
    <Item Title="9">xxx</Item>
  </Group>
</Information>

这首先删除但不是全部: x.Descendants("Group").Where(p => p.Attribute("Visible").Value == "False").First().Remove(); x.Descendants("Item").Where(p => p.Attribute("Visible").Value == "False").First().Remove();

对我来说,使用 XmlDocument 或 XDocument 并不重要,但我尝试使用 Linq ...

感谢 help/ideas ...肯定有很多选择,但是...一个不错的选择:-)

请尝试以下解决方案。

它基于 LINQ to XML。

作为替代解决方案,通过 XSLT 很容易实现。

输入XML文件

<?xml version="1.0" encoding="UTF-8"?>
<Information>
    <Group Title="Abc">
        <Item Title="12" Visible="False">xxx</Item>
        <Item Title="34">xxx</Item>
    </Group>
    <Group Title="Def" Visible="False">
        <Item Title="56">xxx</Item>
    </Group>
    <Group Title="Ghi">
        <Item Title="78">xxx</Item>
        <Item Title="9">xxx</Item>
        <Item Title="10" Visible="False">xxx</Item>
    </Group>
    <Group Title="Def" Visible="False">
        <Item Title="56">xxx</Item>
    </Group>
</Information>

c#

void Main()
{
    const string inputXML = @"e:\Temp\MortenFredsgaardRasmussen.xml";
    const string outputXML = @"e:\Temp\MortenFredsgaardRasmussen_output.xml";

    XDocument xdoc = XDocument.Load(inputXML);

    xdoc.Descendants("Group")
        .Where(x => x.Attribute("Visible") != null)
        .Where(x => x.Attribute("Visible").Value.Equals("False"))
        .ToList()
        .ForEach(x => x.Remove());

    xdoc.Save(outputXML);
}

输出XML

<Information>
  <Group Title="Abc">
    <Item Title="12" Visible="False">xxx</Item>
    <Item Title="34">xxx</Item>
  </Group>
  <Group Title="Ghi">
    <Item Title="78">xxx</Item>
    <Item Title="9">xxx</Item>
    <Item Title="10" Visible="False">xxx</Item>
  </Group>
</Information>