閱讀580 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go Execution error: \&#39;the function name is not a recognized built-in function name\&#39;
  下一篇:go C# POST XML(修正中文亂碼問題)