C# Xml 移除指定節點
XML樣例:
<?xml version="1.0" encoding="gb2312"?> <bookstore> <book genre="李1" ISBN="2-3645-4"> <title>Net從入門到精通</title> <author>李大蒜</author> <price>58.3</price> </book> <book genre="李2" ISBN="2-3631-4"> <title>CS從入門到精通</title> <author>候捷</author> <price>58.3</price> </book> <book genre="李3" ISBN="2-3631-4"> <title>CS從入門到精通</title> <author>候捷</author> <price>58.3</price> </book> </bookstore>
執行代碼一:
/// <summary> /// 刪除屬性值等於“AttributeValue”的節點 /// </summary> /// <param name="xmlFileName">XML文檔完全文件名(包含物理路徑)</param> /// <param name="xpath">要匹配的XPath表達式(例如:"//節點名//子節點名</param> /// <param name="xmlAttributeName">要刪除包含xmlAttributeName屬性的節點的名稱</param> /// <param name="AttributeValue"></param> 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); }
實驗:XmlNodeByXPath("E:\\bookstore.xml", "bookstore", "genre", "李3");
結果:
<?xml version="1.0" encoding="gb2312"?> <bookstore> <book genre="李1" ISBN="2-3645-4"> <title>Net從入門到精通</title> <author>李大蒜</author> <price>58.3</price> </book> <book genre="李2" ISBN="2-3631-4"> <title>CS從入門到精通</title> <author>候捷</author> <price>58.3</price> </book> </bookstore>
小注:
1、刪除節點不能使用foreach,使用的話會造成刪除XML一個節點,就跳出循環,也不報錯,很隱蔽的錯誤。
2、該函數也可以這麼實現
/// <summary>
/// 刪除屬性值等於“AttributeValue”的節點
/// </summary>
/// <param name="xmlFileName">XML文檔完全文件名(包含物理路徑)</param>
/// <param name="xpath">要匹配的XPath表達式(例如:"//節點名//子節點名</param>
/// <param name="xmlAttributeName">要刪除包含xmlAttributeName屬性的節點的名稱</param>
/// <param name="AttributeValue"></param>
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);
}
最後更新:2017-04-03 12:54:19