C#下通过LINQ实现对XML文档指定节点的删除操作

发表于:2014-7-03 09:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李飞麟    来源:51Testing软件测试采编

  之前操作XML文档基本上用的是XmlDocument对象,对一些小文件的操作使用还挺顺手,今天偶尔用来操作一个4M的XML文件,发现查询指定的节点并删除时执行时间很长。在Web项目下和控制台程序中都出现很长时间程序无响应,并且CPU占用很高。不知道是我写的代码有问题还是本身这个对象不适合操作打文件呢?我的代码如下:
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(ConfigFilePath);
XmlNodeList nodeList = xmlDocument.SelectNodes("/System/add");
foreach (XmlNode node in nodeList)
{
if (node.Attributes["key"] != null)
{
if (node.Attributes["key"].Value.Equals(key, StringComparison.CurrentCultureIgnoreCase))
{
node.RemoveAll();
}
}
}
  就是查询根节点System下add子节点,如果该节点的key属性和指定的属性相等,则删除此节点。经过运行发现,我的一个4M大的文件大概1万个节点,执行起来一直无响应。希望高手能给个解答。
  后来考虑到是操作XML文件,于是想起用LINQ TO XML来实现,同样的功能我实现如下:
  XElement rootNodes = XDocument.Load(ConfigFilePath).Root;
  rootNodes.Elements("add").Where(el => el.Attribute("key").Value.Equals(key)).Remove();
  经测试,该方法指定时间仅仅在200毫秒左右,简直不是一个数量级别的。
  同样的一个园友用以下方法实现删除功能:
private static void DeleteXmlNodeInformation(string xmlPath)
{
try
{
//定义并从xml文件中加载节点(根节点)
XElement rootNode = XElement.Load(xmlPath);
//查询语句: 获取ID属性值等于"999999"的所有User节点
IEnumerable<XElement> targetNodes = from target in rootNode.Descendants("User")
where target.Attribute("ID").Value.Equals("999999")
select target;
//将获得的节点集合中的每一个节点依次从它相应的父节点中删除
targetNodes.Remove();
//保存对xml的更改操作
rootNode.Save(xmlPath);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号