XML样例:
执行代码一:Net从入门到精通 李大蒜 58.3 CS从入门到精通 候捷 58.3 CS从入门到精通 候捷 58.3
实验:XmlNodeByXPath("E:\\bookstore.xml", "bookstore", "genre", "李3");/// /// 删除属性值等于“AttributeValue”的节点 /// /// XML文档完全文件名(包含物理路径) /// 要匹配的XPath表达式(例如:"//节点名//子节点名 /// 要删除包含xmlAttributeName属性的节点的名称 /// private void XmlNodeByXPath(string xmlFileName, string xpath, string xmlAttributeName, string AttributeValue) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlFileName); XmlNodeList xNodes = xmlDoc.SelectSingleNode(xpath).ChildNodes; for (int i = xNodes.Count - 1; i >= 0; i--) { XmlElement xe = (XmlElement)xNodes[i]; if (xe.GetAttribute(xmlAttributeName) == AttributeValue) { xNodes[i].ParentNode.RemoveChild(xNodes[i]); } } xmlDoc.Save(xmlFileName); }
结果:
小注:Net从入门到精通 李大蒜 58.3 CS从入门到精通 候捷 58.3
1、删除节点不能使用foreach,使用的话会造成删除XML一个节点,就跳出循环,也不报错,很隐蔽的错误。
2、该函数也可以这么实现
/// /// 删除属性值等于“AttributeValue”的节点 /// /// XML文档完全文件名(包含物理路径) /// 要匹配的XPath表达式(例如:"//节点名//子节点名 /// 要删除包含xmlAttributeName属性的节点的名称 /// private void XmlNodeByXPath(string xmlFileName, string xpath, string xmlAttributeName, string AttributeValue) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlFileName); XmlNode root = xmlDoc.SelectSingleNode(xpath); XmlNodeList xnl = xmlDoc.SelectSingleNode(xpath).ChildNodes; for (int i = 0; i < xnl.Count; i++) { XmlElement xe = (XmlElement)xnl.Item(i); if (xe.GetAttribute(xmlAttributeName) == AttributeValue) { root.RemoveChild(xe); if (i < xnl.Count) i = i - 1; } } xmlDoc.Save(xmlFileName); }