【问题标题】:XML/C#: Eeasiest way to delete elements with a specific attributeXML/C#:删除具有特定属性的元素的最简单方法
【发布时间】:2021-12-30 09:44:42
【问题描述】:

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 ...

感谢您的帮助/想法...肯定有很多选择,但是...一个不错的选择:-)

【问题讨论】:

    标签: xml linq linq-to-xml xmldocument


    【解决方案1】:

    请尝试以下解决方案。

    它基于 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>
    

    【讨论】:

    • 很好的解决方案,谢谢!当您以正确的方式放置时,这很容易:-) 我只是为 Items (xdoc.Descendants("Item")...) 添加相同的内容,然后一切都很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2012-01-16
    • 2013-01-25
    相关资源
    最近更新 更多