【C#】C#操作XML方法:新增、修改和刪除節點與屬性
一 前言
先來了解下操作XML所涉及到的幾個類及之間的關係 如果大家發現少寫了一些常用的方法,麻煩在評論中指出,我一定會補上的!謝謝大家
* 1 XMLElement 主要是針對節點的一些屬性進行操作
* 2 XMLDocument 主要是針對節點的CUID操作
* 3 XMLNode 為抽象類,做為以上兩類的基類,提供一些操作節點的方法
清楚了以上的關係在操作XML時會更清晰一點
二 具體操作
以下會對Xml的結點與屬性做增 刪 改 查的操作也滿足了實際工作中的大部分情況
先構造一棵XML樹如下,其中也涉及到了寫入xml文件的操作
1 public void CreatXmlTree(string xmlPath) 2 { 3 XElement xElement = new XElement( 4 new XElement("BookStore", 5 new XElement("Book", 6 new XElement("Name", "C#入門", new XAttribute("BookName", "C#")), 7 new XElement("Author", "Martin", new XAttribute("Name", "Martin")), 8 new XElement("Adress", "上海"), 9 new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd")) 10 ), 11 new XElement("Book", 12 new XElement("Name", "WCF入門", new XAttribute("BookName", "WCF")), 13 new XElement("Author", "Mary", new XAttribute("Name", "Mary")), 14 new XElement("Adress", "北京"), 15 new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd")) 16 ) 17 ) 18 ); 19 20 //需要指定編碼格式,否則在讀取時會拋:根級別上的資料無效。 第 1 行 位置 1異常 21 XmlWriterSettings settings = new XmlWriterSettings(); 22 settings.Encoding = new UTF8Encoding(false); 23 settings.Indent = true; 24 XmlWriter xw = XmlWriter.Create(xmlPath,settings); 25 xElement.Save(xw); 26 //寫入檔案 27 xw.Flush(); 28 xw.Close(); 29 }
然後得到如下的XML樹
1 <?xml version="1.0" encoding="utf-8"?> 2 <BookStore> 3 <Book> 4 <Name BookName="C#">C#入門</Name> 5 <Author Name="Martin">Martin</Author> 6 <Date>2013-10-11</Date> 7 <Adress>上海</Adress> 8 <Date>2013-10-11</Date> 9 </Book> 10 <Book> 11 <Name BookName="WCF">WCF入門</Name> 12 <Author Name="Mary">Mary</Author> 13 <Adress>北京</Adress> 14 <Date>2013-10-11</Date> 15 </Book> 16 </BookStore>
以下操作都是對生成的XML樹進行操作
2.1 新增節點與屬性
新增節點NewBook並增加屬性Name="WPF"
1 public void Create(string xmlPath) 2 { 3 XmlDocument xmlDoc = new XmlDocument(); 4 xmlDoc.Load(xmlPath); 5 6 var root = xmlDoc.DocumentElement;//取到根結點 7 XmlNode newNode = xmlDoc.CreateNode("element", "NewBook", ""); 8 newNode.InnerText = "WPF"; 9 10 //新增為根元素的第一層子結點 11 root.AppendChild(newNode); 12 xmlDoc.Save(xmlPath); 13 }
開篇有寫操作xml節點屬性主要用XmlElement物件所以取到結點後要轉型別
1 //屬性 2 public void CreateAttribute(string xmlPath) 3 { 4 XmlDocument xmlDoc = new XmlDocument(); 5 xmlDoc.Load(xmlPath); 6 var root = xmlDoc.DocumentElement;//取到根結點 7 XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook"); 8 node.SetAttribute("Name", "WPF"); 9 xmlDoc.Save(xmlPath); 10 11 }
效果如下
2.2 刪除節點與屬性
1 public void Delete(string xmlPath) 2 { 3 XmlDocument xmlDoc = new XmlDocument(); 4 xmlDoc.Load(xmlPath); 5 var root = xmlDoc.DocumentElement;//取到根結點 6 7 var element = xmlDoc.SelectSingleNode("BookStore/NewBook"); 8 root.RemoveChild(element); 9 xmlDoc.Save(xmlPath); 10 }
刪除屬性
1 public void DeleteAttribute(string xmlPath) 2 { 3 XmlDocument xmlDoc = new XmlDocument(); 4 xmlDoc.Load(xmlPath); 5 XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook"); 6 //移除指定屬性 7 node.RemoveAttribute("Name"); 8 //移除當前節點所有屬性,不包括預設屬性 9 //node.RemoveAllAttributes(); 10 xmlDoc.Save(xmlPath); 11 }
2.3 修改節點與屬性
xml的節點預設是不允許修改的,本文也就不做處理了
修改屬性程式碼如下
1 public void ModifyAttribute(string xmlPath) 2 { 3 XmlDocument xmlDoc = new XmlDocument(); 4 xmlDoc.Load(xmlPath); 5 XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook"); 6 element.SetAttribute("Name", "Zhang"); 7 xmlDoc.Save(xmlPath); 8 }
效果如下
2.4 獲取節點與屬性
1 public void Select(string xmlPath) 2 { 3 XmlDocument xmlDoc = new XmlDocument(); 4 xmlDoc.Load(xmlPath); 5 //取根結點 6 var root = xmlDoc.DocumentElement;//取到根結點 7 //取指定的單個結點 8 XmlNode oldChild = xmlDoc.SelectSingleNode("BookStore/NewBook"); 9 10 //取指定的結點的集合 11 XmlNodeList nodes = xmlDoc.SelectNodes("BookStore/NewBook"); 12 13 //取到所有的xml結點 14 XmlNodeList nodelist = xmlDoc.GetElementsByTagName("*"); 15 }
屬性
1 public void SelectAttribute(string xmlPath) 2 { 3 XmlDocument xmlDoc = new XmlDocument(); 4 xmlDoc.Load(xmlPath); 5 XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook"); 6 string name = element.GetAttribute("Name"); 7 Console.WriteLine(name); 8 }
三 linq to XML 操作
Linq to Xml 也沒什麼變化只操作物件改變了主要涉及的幾個物件如下 注:我並沒有用linq的語法去操作元素。
XDocument:用於建立一個XML例項文件
XElement:用於一些節點與節點屬性的基本操作
以下是對Xml的 一些簡單的操作
3.1 新增節點與屬性
1 public void Create(string xmlPath) 2 { 3 XDocument xDoc = XDocument.Load(xmlPath); 4 XElement xElement = xDoc.Element("BookStore"); 5 xElement.Add(new XElement("Test", new XAttribute("Name", "Zery"))); 6 xDoc.Save(xmlPath); 7 }
屬性
1 public void CreateAttribute(string xmlPath) 2 { 3 XDocument xDoc = XDocument.Load(xmlPath); 4 IEnumerable<XElement> xElement = xDoc.Element("BookStore").Elements("Book"); 5 foreach (var element in xElement) 6 { 7 element.SetAttributeValue("Name", "Zery"); 8 } 9 xDoc.Save(xmlPath); 10 }
3.2 刪除節點與屬性
1 public void Delete(string xmlPath) 2 { 3 XDocument xDoc = XDocument.Load(xmlPath); 4 XElement element = (XElement)xDoc.Element("BookStore").Element("Book"); 5 element.Remove(); 6 xDoc.Save(xmlPath); 7 }
屬性
1 public void DeleteAttribute(string xmlPath) 2 { 3 XDocument xDoc = XDocument.Load(xmlPath); 4 //不能跨級取節點 5 XElement element = xDoc.Element("BookStore").Element("Book").Element("Name"); 6 element.Attribute("BookName").Remove(); 7 xDoc.Save(xmlPath); 8 }
3.3 修改節點屬性
節點.net沒提供修改的方法本文也不做處理
修改屬性與新增實質是同一個方法
1 public void ModifyAttribute(string xmlPath) 2 { 3 XDocument xDoc = XDocument.Load(xmlPath); 4 XElement element = xDoc.Element("BookStore").Element("Book"); 5 element.SetAttributeValue("BookName","ZeryTest"); 6 xDoc.Save(xmlPath); 7 }
四 總結
把文章寫完時,又掃去了自己的一個盲區,雖然都是些簡單的操作,但在實際的開中,又何嘗不是由簡單到複雜呢。我覺得身為程式設計師就應該遇到自己的盲區時,立馬花時間去了解,不說要了解多深入,但至少基本的還是要知道,等到工作中真需時,只要稍微花點時間就可以了。
相關推薦
【C#】C#操作XML方法:新增、修改和刪除節點與屬性
一 前言 先來了解下操作XML所涉及到的幾個類及之間的關係 如果大家發現少寫了一些常用的方法,麻煩在評論中指出,我一定會補上的!謝謝大家 * 1 XMLElement 主要是針對節點的一些屬性進行操作 * 2 XMLDocument 主要是針對節點的CUID操作 *
C# 新增、修改和刪除PDF書籤
有時候我們在閱讀PDF文件時會遇到這樣一種情況:PDF文件頁數比較多,但是又沒有書籤,所以我們不能根據書籤快速瞭解文件所講解的內容,也不能點選書籤快速跳轉到相應的位置,而只能一頁一頁的翻閱,非常苦惱。相信開發人員在開發和PDF有關的應用程式時,也會有這樣的功能需求,因此在
【Android】AS警告解決方法:String literal in setText can not be translated. Use Android resources instead.
轉載請註明出處,原文連結:https://blog.csdn.net/u013642500/article/details/80166941 【錯誤】 String literal in setText can not be translated. Use Android reso
c# 操作xml檔案,新增、刪除節點
/// <summary> /// 刪除當前選擇節點 /// </summary> /// <param name="sender"></param>
【深度學習理論】正則化方法:L1、L2、資料擴增、Dropout
正則化 在訓練資料不夠多時,或者過度訓練時,常常會導致overfitting(過擬合)。隨著訓練過程的進行,模型複雜度增加,在train data上的error漸漸減小,但是在驗證集上的err
在C 函數中保存狀態:registry、reference和upvalues
targe 閉包 一個 兩個 table chang detail chan 這樣的 在C函數中保存狀態:registry、reference和upvalues C函數能夠通過堆棧來和Lua交換數據,但有時候C函數須要在函數體的作用域之外保存某些Lua數
C#對DataGridView中的資料進行新增、修改、刪除操作c#操作datatable
1.建立表 DataSet ds=new DataSet(); DataTable dt=new DataTable("User"); ds.Add(dt); dt.Columns.Add("user_name",typeof(string)); dt.Columns.Ad
【Android】多語言適配:語言、名稱、與資源對應關係
語言碼_國家碼 -> 語言選擇裡的顯示語言 -> 英文下的語言(國家) -> 簡體中文下的語言(國家) af -> Afrikaans -> Afrikaans -> 南非荷蘭文 af_N
【資料庫】關於規範化的瞎扯:1NF、2NF、3NF、BCNF
首先要理解,什麼是函式依賴、完全函式依賴、部分函式依賴、傳遞函式依賴、碼、候選碼、主碼、全碼、主屬性、非主屬性。碼(Key):關係中的一個屬性集合,其屬性值可以唯一標識關係中的每個元組。候選碼(Candidate key):若一個碼的任意一個真子集都不為碼時,稱其為候選碼。或
【python】如何在類方法前新增裝飾器
import traceback def close_connection(): def _wrapper(func): def __wrapper(self, *args, **kwargs): try:
【Angular4】基礎(四):元件通訊(@Input和@Output)
元件通訊有兩種方式: 父到子(用@Input裝飾器) 子到父(用@Output裝飾器) 注意: 輸入輸出針對的物件 是 父子元件 1)父到子 父到子的資料傳遞其實就是通過將子元件上的一個屬性繫結到父元件的一個屬性上,一般我們使用@Input()屬
多執行緒學習(4):三種實現Java多執行緒的方法:Thread、Callable和Runable 的比較與區別
2018年10月03日 目錄 前言 前言 JVM允許應用程式併發執行多執行緒:最常用的是兩個方法:(1)基礎Thread類,重寫run()方法;(2)或實現Runnable 介面,實現介面的run()方法;(3)另外一種方法是:實現callable 介面
如何確定Kafka的分割槽數、key和consumer執行緒數 【原創】如何確定Kafka的分割槽數、key和consumer執行緒數
【原創】如何確定Kafka的分割槽數、key和consumer執行緒數 在Kafak中國社群的qq群中,這個問題被提及的比例是相當高的,這也是Kafka使用者最常碰到的問題之一。本文結合Kafka原始碼試圖對該問題相關的因素進行探討。希望對大家有所幫助。
【系列】EOS開發4 EOS中賬戶、錢包和密鑰的關系
執行 2個 通過 合約 默認 分享圖片 iss 新的 分享 EOS對於賬戶的設計與ETH有很大的不同,引入了Account賬戶, Wallet錢包, 錢包密碼, Key公私鑰, Permission權限等眾多概念,剛入門的時候感覺一頭霧水。本文希望通過對這些概念的梳理,幫助
MySQL:創建、修改和刪除表
rop ont ... rst incr arc bigint 第一個 desc 1.創建數據庫:CREATE DATABASE 數據庫名; 刪除數據庫:DROP DATABASE 數據庫名; 查看數據庫編碼:SHOW CREATE DATABASE 數據庫名;
製作英文學習詞典。編寫程式製作英文學習詞典,詞典有3個基本功能:新增、查詢和退出。程式讀取原始檔路徑下的txt格式詞典檔案,若沒有就建立一個(Python)
以下路徑可更換為你自己的路徑,本程式採用Python語言大致實現了serach()查詢函式和add()新增函式。細節有待完善,謝謝 def search(): w=input("請輸入要查詢的單詞:") fr=open("C:\\Users
【轉載】C#掃盲之:帶你掌握C#的擴展方法、以及探討擴展方法的本質、註意事項
title [] 很多 標記 真的 參考資料 console 需求 length 1、為什麽需要擴展方法 .NET3.5給我們提供了擴展方法的概念,它的功能是在不修改要添加類型的原有結構時,允許你為類或結構添加新方法。 思考:那麽究竟為什麽需要擴展方法呢,為什麽不直接修
【C/C++】string操作方法彙總如下
本文提供【C/C++】string操作方法彙總如下: 原文地址:http://sodino.com/2015/02/04/c-string-operate/ 判斷內容是否相同 字串複製 字串拼接 字串拼接單個char 字串類別檢查 字串子串擷取 (substring) 字串界位符切割 (st
【C#】C# 操作XML
private void addBugCommentToDB(string header, string text) { string xmlContent = myManageDB.getDataFromCell("bugComment", "BugManage
【c】檔案操作函式:fprintf,fread,fwrite,fseek,ftell,fopen,fclose,fflush以及獲取檔案長度示例
Date: 2018.9.20 1、參考 2、 fprintf 3、fread 作用:從一個檔案流中讀取資料。 Read block of data from stream Reads an ar