前言:
最近做了一個項目,程式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);
}
}

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);
}
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;
}
}
}
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;
}
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;
}
}
}
6.XML轉義字元
< | < | 小于 |
> | > | 大于 |
& | & | 和号 |
' | ' | 單引号 |
" | " | 引号 |
最後分享一下調用方法的代碼部分:
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); //删除節點
}
}