前言:
最近對接了一個第三方的專案,該專案的資料傳輸格式是XML。由於工作多年只有之前在醫療行業的時候有接觸過少量資料格式是XML的介面,之後就幾乎沒有接觸過了。因此對於XML這塊自己感覺還是有很多盲點和不足的,所以自己通過一些網上的資料總結了一下XML相關知識點。
什麼是XML?
- XML是一種可擴充套件標記語言(EXtensible Markup Language)。
- XML是一種很像HTML的標記語言。
- XML的設計宗旨是傳輸資料,而不是顯示資料。
- XML標籤沒有被預定義。您需要自行定義標籤。
- XML被設計為具有自我描述性。
- XML是 W3C 的推薦標準。
XML的優缺點
XML的優點
- 語法嚴謹,格式統一,符合標準。
- 容易與其他系統進行遠端互動,資料共享比較方便。
XML的缺點
- 擴充套件性、彈性、易讀性均不佳。
- XML檔案龐大,檔案格式複雜,傳輸佔頻寬。
- 伺服器端和客戶端解析XML花費較多的資源和時間。
XML簡單示例
線上xml驗證工具:https://tool.ip138.com/xml/
<?xml version="1.0" encoding="utf-8"?> <books> <book> <author>追逐時光者</author> <title>XML學習教程</title> <publisher>時光出版社</publisher> </book> </books>
XML中5個預定義的實體引用
轉義字元 | 符號 | 名稱 |
---|---|---|
& |
& | 和號 |
< |
< | 小於 |
> |
> | 大於 |
' |
' | 省略號 |
" |
" | 引號 |
嚴格地講,在 XML 中僅有字元 "<"和"&" 是非法的。省略號、引號和大於號是合法的。這時,Xml有兩種解決方案來處理這種問題。
- CDATA
- 轉義字元
C#把特殊符號轉換為轉義字元
/// <summary> /// 特殊符號轉換為轉義字元 /// </summary> /// <param name="xmlStr"></param> /// <returns></returns> public string XmlSpecialSymbolConvert(string xmlStr) { return xmlStr.Replace("&", "&").Replace("<", "<").Replace(">", ">").Replace("\'", "'").Replace("\"", """); }
C#建立簡單的XML檔案
/// <summary> /// 建立Xml檔案 /// </summary> public void CreateXmlFile() { XmlDocument xmlDoc = new XmlDocument(); //建立型別宣告節點 XmlNode node = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", ""); xmlDoc.AppendChild(node); //建立Xml根節點 XmlNode root = xmlDoc.CreateElement("books"); xmlDoc.AppendChild(root); XmlNode root1 = xmlDoc.CreateElement("book"); root.AppendChild(root1); //建立子節點 CreateNode(xmlDoc, root1, "author", "追逐時光者"); CreateNode(xmlDoc, root1, "title", "XML學習教程"); CreateNode(xmlDoc, root1, "publisher", "時光出版社"); //將檔案儲存到指定位置 xmlDoc.Save("D://xmlSampleCreateFile.xml"); } /// <summary> /// 建立節點 /// </summary> /// <param name="xmlDoc">xml文件</param> /// <param name="parentNode">Xml父節點</param> /// <param name="name">節點名</param> /// <param name="value">節點值</param> /// public void CreateNode(XmlDocument xmlDoc, XmlNode parentNode, string name, string value) { //建立對應Xml節點元素 XmlNode node = xmlDoc.CreateNode(XmlNodeType.Element, name, null); node.InnerText = value; parentNode.AppendChild(node); }
建立生成的Xml檔案
<?xml version="1.0" encoding="utf-8"?> <books> <book> <author>追逐時光者</author> <title>XML學習教程</title> <publisher>時光出版社</publisher> </book> </books>
C#在XML檔案新增節點
這次我們是在上一次新建的XML檔案中做操作,在book二級節點下新增一個新的節點名為publishdate(釋出時間),該節點的value為2022-03-26。
private static void AppendNode() { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("D://xmlSampleCreateFile.xml");//載入Xml檔案 XmlNode root = xmlDoc.SelectSingleNode("books/book");//選擇要新增子節點的book節點 //建立一個新的Xml節點元素 XmlNode node = xmlDoc.CreateNode(XmlNodeType.Element, "publishdate", null); node.InnerText = "2022-03-26"; root.AppendChild(node);//將建立的item子節點新增到items節點的尾部 xmlDoc.Save("D://AppendNodeFile.xml");//儲存修改的Xml檔案內容 }
新增節點成功後的XML檔案內容
<?xml version="1.0" encoding="utf-8"?> <books> <book> <author>追逐時光者</author> <title>XML學習教程</title> <publisher>時光出版社</publisher> <publishdate>2022-03-26</publishdate> </book> </books>
C#修改XML檔案節點的資料
這次我們是在第一次新建的XML檔案中做操作,把在book二級節點下的author的內容改成:大姚同學
private static void UpdateXml() { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("D://xmlSampleCreateFile.xml");//載入Xml檔案 XmlNode xns = xmlDoc.SelectSingleNode("books/book");//查詢要修改的節點 XmlNodeList xmlNodeList = xns.ChildNodes;//取出book節點下所有的子節點 foreach (XmlNode xmlNode in xmlNodeList) { XmlElement xmlElement = (XmlElement)xmlNode;//將節點轉換一下型別 if (xmlElement.Name=="author")//判斷該子節點是否是要查詢的節點 { xmlElement.InnerText = "大姚同學";//設定新值 break; } } xmlDoc.Save("D://UpdateXml.xml");//儲存修改的Xml檔案內容 }
修改後的XML檔案內容
<?xml version="1.0" encoding="utf-8"?> <books> <book> <author>大姚同學</author> <title>XML學習教程</title> <publisher>時光出版社</publisher> </book> </books>
C#刪除XML檔案中的指定節點
這次我們是在第一次新建的XML檔案中做操作,刪除author節點。
private static void DeleteXmlNode() { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("D://xmlSampleCreateFile.xml");//載入Xml檔案 XmlNode xns = xmlDoc.SelectSingleNode("books/book");//查詢要刪除的根節點 #region 刪除author節點 var delNode = xmlDoc.SelectSingleNode("books/book/" + "author"); xns.RemoveChild(delNode); #endregion xmlDoc.Save("D://DeleteXmlNode.xml");//儲存操作後的Xml檔案內容 }
C#清空指定XML節點資料
這次我們是在第一次新建的XML檔案中做操作,清空author節點下的資料。
private static void ClearDataXmlNode() { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("D://xmlSampleCreateFile.xml");//載入Xml檔案 XmlNode xns = xmlDoc.SelectSingleNode("books/book");//查詢要刪除的根節點 #region 清空author節點下的資料 XmlNodeList xmlNodeList = xns.ChildNodes;//取出book節點下所有的子節點 foreach (XmlNode xmlNode in xmlNodeList) { XmlElement xmlElement = (XmlElement)xmlNode;//將節點轉換一下型別 if (xmlElement.Name == "author")//判斷該子節點是否是要查詢的節點 { //清空author節點下的資料 xmlElement.RemoveAll();//刪除該節點的全部內容 } } #endregion xmlDoc.Save("D://ClearDataXmlNode.xml");//儲存操作後的Xml檔案內容 }
學習參考資料
.NET中XML序列化和反序列化常用類和用來控制XML序列化的屬性總結