天天看點

.NET 對 XML 進行建立,增加,删除,修改操作整理

前言: 

  最近做了一個項目,程式A在一個伺服器程式B在另一台伺服器,然而主程式A需要通路程式B的圖檔集檔案夾下載下傳到本伺服器上,為了防止多次對Web Services進行調用,在主程式A中建立一個XML檔案用于記錄圖檔集中的某張圖檔是否下載下傳過,如果下載下傳就不需調用,沒下載下傳就需要調用服務。我也是枚小菜鳥,之前重來沒寫過XML檔案這一塊,于是翻書(C# 進階程式設計 第10版 Christian Nagel著)上網查資料,終于整理出來一套自己能用得上對XML讀寫等操作的筆記。為了學習和分享決定放在自己的部落格中,以後遇到類似問題可以進行鞏固,如果那裡寫的有誤希望讀者留言加以改正,接下來看我實作的步驟。

需要引用的命名空間:

using System.IO; 
using System.Xml;      

1.建立XML檔案

private void createXml(string xmlPath)            //建立train的xml檔案
        {
            if (!File.Exists(xmlPath))        //判斷是否建立過xml檔案
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml("<?xml version='1.0' encoding='gb2312' ?>" +
                    "<train>" +
                    "</train>");
                doc.Save(xmlPath);
            }
        }      
.NET 對 XML 進行建立,增加,删除,修改操作整理

2.插入元素

     private void addXmlNode(string BatchId, string BatchName, string BatchNo,string xmlPath)           //增加節點 (教育訓練批次id,教育訓練批次名稱,圖檔編号集合,XML路徑)
        {
            XmlDocument xmldoc = new XmlDocument();                         //執行個體一個xml檔案
            xmldoc.Load(xmlPath);                     //讀取xml檔案

            XmlNode train = xmldoc.SelectSingleNode("train");               //查找train   

            XmlElement el = xmldoc.CreateElement("trainbatch");              //建立一個trainbatch
            el.SetAttribute("Name", BatchName);                           //添加屬性

            XmlElement elBatchId = xmldoc.CreateElement("BatchId");          //建立<trainbatch>節點的第一個下級節點
            elBatchId.InnerText = BatchId;                                  //指派
            el.AppendChild(elBatchId);                                       //追加到trainbatch下

            XmlElement elBatchName = xmldoc.CreateElement("BatchName");
            elBatchName.InnerText = BatchName;
            el.AppendChild(elBatchName);

            XmlElement elBatchNo = xmldoc.CreateElement("BatchNo");          //建立<trainbatch>節點的第二個下級節點
            elBatchNo.InnerText = BatchNo;     //指派
            el.AppendChild(elBatchNo);                                       //追加到trainbatch下

            train.AppendChild(el);                                           //所有添加元素追加到根目錄下
            xmldoc.Save(xmlPath);
        }      
.NET 對 XML 進行建立,增加,删除,修改操作整理

3.修改第一個trainbatch節點下的BatchNo的值

private void updateXmlNode(string BatchId, string BatchNo,string xmlPath)           //修改xml檔案  (教育訓練批次id,将要修改的圖檔編号集合,XML路徑)
        {
            XmlDocument xmldoc = new XmlDocument();
            xmldoc.Load(xmlPath);

            XmlNodeList titleNodes = xmldoc.SelectSingleNode("train").ChildNodes;       //擷取train下一層的節點
            foreach (XmlNode node in titleNodes)            //循環所有trainbatch節點
            {
                XmlElement el = (XmlElement)node.ChildNodes[0];         //擷取第一個節點值
                if (el.InnerText == BatchId)            //判斷第一個trainbatch的id是否等于将要修改的id
                {
                    node.ChildNodes[2].InnerText = BatchNo;             //給第三個節點指派
                    xmldoc.Save(xmlPath);                               //儲存(不要忘記這步驟哦)
                    break;
                }
            }
        }      
.NET 對 XML 進行建立,增加,删除,修改操作整理

4.擷取第一個trainbatch節點下的BatchNo值

private string getXmlNodeValue(string BatchId,string xmlPath)              //擷取某次教育訓練是否記錄在xml
        {
            XmlDocument xmldoc = new XmlDocument();             //執行個體化XML文檔
            xmldoc.Load(xmlPath);                               //加載将要打開的文檔

            string result = "";
            XmlNodeList titleNodes = xmldoc.SelectSingleNode("train").ChildNodes;        //擷取train下一層的節點
            foreach (XmlNode node in titleNodes)                                        //循環所有的trainbatch節點
            { 
                XmlElement el = (XmlElement)node.ChildNodes[0];                         //擷取trainbatch下的第一個節點元素
                if (el.InnerText == BatchId)
                {
                    result = node.ChildNodes[2].InnerText.ToString();                   //傳回trainbatch下的第三個節點元素
                    return result;
                } 
            }
            return result;
        }      
.NET 對 XML 進行建立,增加,删除,修改操作整理

5.根據條件删除trainbatch節點

private void deleteXmlNode(string BatchName, string xmlPath)                     //删除某個節點元素
        {
            XmlDocument xmldoc = new XmlDocument();
            xmldoc.Load(xmlPath);

            XmlNodeList titleNodes = xmldoc.SelectSingleNode("train").ChildNodes;        //擷取train下一層的節點
            foreach (XmlNode node in titleNodes)
            {  
                XmlElement el = (XmlElement)node;
                if (el.GetAttribute("Name") == BatchName)                               //el.GetAttribute 擷取trainbatch屬性
                {
                    el.RemoveAll();                                                         //删除目前元素和所有子元素
                    xmldoc.Save(xmlPath);
                    break;
                }
            } 
        }      
.NET 對 XML 進行建立,增加,删除,修改操作整理

6.XML轉義字元

&lt; 小于
&gt; 大于
&amp; & 和号
&apos; ' 單引号
&quot; " 引号

最後分享一下調用方法的代碼部分:

protected void Page_Load(object sender, EventArgs e)
        { 
            if (!Page.IsPostBack)
            {
                string xmlPath = Server.MapPath("TestXml.xml");                          //XML路徑位址 

                createXml(xmlPath);                                                      //建立XML檔案

                addXmlNode("1", "ASP.NET教育訓練第一期", "123,134,454,789,454,315,456", xmlPath);                //插入第一個節點
                addXmlNode("2", "ASP.NET教育訓練第二期", "0123,0134,0454,0789,0454,0315,0456", xmlPath);         //插入第二個節點
                addXmlNode("3", "ASP.NET教育訓練第三期", "0123,0134,0454,0789,0454,0315,0456", xmlPath);         //插入第三個節點
                addXmlNode("4", "ASP.NET教育訓練第四期", "0123,0134,0454,0789,0454,0315,0456", xmlPath);         //插入第四個節點

                string result = getXmlNodeValue("1", xmlPath);                           //擷取節點值

                updateXmlNode("1", "0123,0134,0454,0789,0454,0315,0456", xmlPath);       //修改節點值

                deleteXmlNode("ASP.NET教育訓練第二期", xmlPath);                             //删除節點
            }
        }