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