XmlNode與XmlElement的區別總結
原文鏈接:http://www.cnblogs.com/oilsun/archive/2012/07/07/2580427.html
今 天在做ASP.NET操作XML文檔的過程中,發現了兩個類:XmlNode和XmlElement。這兩個類的功能極其類似(因為我們一般都是在對 Element節點進行操作)。上網搜羅了半天,千篇一律的答案。永遠說不到重點,有些人回答又特別含糊,無奈之下,自己設斷點嘗試對比效果,現在總結如 下:
1、通過繼承關系XmlElement繼承自XmlLinkedNode又繼承自XmlNode類,由此可知XmlElement是XmlNode的子 類。我們知道子類繼承了父類所有的屬性和方法,因此,XmlNode所擁有的方法和屬性,在XmlElement類中也是可以使用的。
3、XmlElement是具現類,可以直接實例化,而XmlNode是抽象類,必須通過XmlDocument實例通過CreateNode創建。
4、XmlElement擁有眾多對Attribute的操作方法,可以方便的對其屬性進行讀寫操作(XmlNode也可以通過Attributes屬性獲取屬性列表)。
5、在網上看到有人這麽評論這兩個類的區別:XmlNode包含子節點,XmlElement只包含屬性及其本身不含有子節點。但是我通過代碼測試,發現 即使是XmlElement,也可以通過ChildNodes來獲取子節點列表。雖然在斷點中斷模式下,我並沒有發現XmlElement有 ChildNodes屬性。舉例如下:
//既是XmlNode 也是XmlElement
C# //只是XmlNode
也就是元素節點可以相應轉換為XmlElement,這樣既可以使用XmlNode的功能,也可以使用它特有的對屬性的操作方法。
任意節點都可以使用XmlNode,因為XmlNode是所有Node的父類。
管理XML元素的類:XmlElement類
XmlElement類表示DOM結構中的元素。元素是DOM結構中最常見的節點。該類型繼承於XMLNode類的子類XmlLinkNode類, 繼承了XmlNode的特點,同時還提供了XML數據中針對於元素的一些方法和屬性,以便更好地反映元素節點的特征,以及更便捷地操作元素。
該類除繼承XmlNode的特征以外,最重要的特征,和其他XmlNode類派生類不同的地方就是其元素擁有自己的屬性集合。XmlElement 類為此提供了多種對於屬性的訪問手段。例如:可以使用GetAttribute方法獲取指定的屬性,可以使用SetAttribute設置指定的屬性,可 以使用RemoveAttribute移除指定的屬性,可以使用GetAttributeNode獲取屬性節點,還可以直接通過訪問該類的 Attribute屬性獲得元素的屬性列表——該列表支持索引值和名稱兩種訪問指定屬性的手段。
語法定義:
public class XmlElement : XmlLinkedNode
因為XmlElement類的構造函數是受保護的,所以不能使用其創建XmlElement類的實例。一般采用的做法是在XmlDocument類 實例中,使用CreateElement方法創建XmlElement類的實例。下面的代碼演示了使用不同的方法建立XmlElement的實例:
//使用指定的名稱創建XmlElement類的實例 XmlElement elm = new XmlDocument().CreateElement("newelement"); //使用元素的限定名和元素命名空間URL創建XmlElement類的實例 XmlElement elm = new XmlDocument().CreateElement("abc:code","urlname:newelm"); //使用元素前綴、元素本地名稱和元素命名空間URL創建XmlElement類的實例 XmlElement elm = new XmlDocument().CreateElement("xy","item","urlname:abc");
方法:
XmlElement類提供了一系列方法來對XML文檔對象進行操作。主要方法如下:
AppendChild:將指定的節點添加到當前元素的子節點列表的末尾
Clone:克隆當前元素實例
CloneNode:克隆當前元素實例,該方法與Clone方法的區別在於,CloneNode能夠通過指定bool deep參數的值,來決定是否克隆當前元素的子節點。
CreateNavigator:創建瀏覽當期元素的XpathNavigator
GeAttribute:獲取當前元素的指定屬性的屬性值
GetAttributeNode:獲取當前元素指定的屬性節點
GetElementsByTagName:包含指定名稱元素所有子節點的列表
HasAttribute:獲取指示當前節點是否具有指定的屬性值
InsertAfter:在指定元素之後插入節點
InsertBefore:在指定元素之前插入節點
PrependChild:在指定元素的子節點列表開頭添加節點
RemoveAll:移除除了默認屬性以外當前元素的所有指定屬性的子節點
RemoveAllAttributes:移除除了默認屬性以外的所有屬性
RemoveAttribute:移除指定的屬性
RemoveAttributeAt:從元素中移除指定位置的屬性
RemoveAttributeNode:移除指定的XmlAttribute節點
RemoveChild:從節點列表中刪除指定的子節點
ReplaceChild:使用新的節點替換原有的節點
SelectNodes:根據XPath表達式,獲得符合條件的節點列表
SelectSingleNode:根據XPath表達式,獲得符合條件的第一個節點
SetAttribute:指定屬性的值
SetAttributeNode:向當前元素添加屬性
WriteContentTo:使用指定的XmlWriter類實例保存當前元素的所有子節點
WriteTo:使用指定的XmlWriter保存當前元素
屬性詳解:
Attitudes:獲取包含當前元素屬性的列表
BaseURI:獲取當前元素的基URI
ChildNodes:獲取當前元素的所有子節點
FirstChild:獲取當前元素的第一個子節點
HasAttributes:獲取指示當前元素是否有任何屬性值
HasChildNodes:獲取指示當前元素是否有任何子節點的值
InnerText : 獲取或指定當前元素及其所有子節點的串聯值
InnerXml:獲取或指定包含當前元素內所有子節點的、包含結構標誌的XML文本
IsEmpty:獲取或指定元素是否以短標記格式序列化元素的值
IsReadOnly:獲取指示當前元素是否是只讀的值
Item:獲取當前元素指定的子元素
LastChild:獲取當前元素的最後一個子節點
LocalName:獲取當前元素的本地名稱
Name:獲取當前元素的限定名
NamespaceUri:獲取當前元素的命名空間URI
NextSibling : 獲取緊接在當前元素後一個同級節點
NodeType:獲取當前元素的節點類型
OuterXml:獲取表示當前元素及其所有子節點的XML文本
OwnerDocument:獲取當前元素所屬的XmlDocument
ParentNode:獲取當前節點的父節點
Prefix:獲取或指定當前元素的命名空間前綴
PreviousSibling:獲取緊接當前元素的前一個同級節點
Value:獲取或指定當前元素的值
應用:XML元素的添加、修改和刪除
利用XmlElement類提供的對元素結構描述和操作的功能,可以方便地對XML數據中的元素進行操作,包括元素的添加,以及刪除和修改其內容。XmlElement類的主要特征是關於元素本身屬性的一系列屬性和方法。
1、編寫一個XML文件,命名為“Book.xml”,並保存到指定的路徑中。內容如下:
<?xml version="1.0"?> <store> <book id="1" genre="novel" publicaiondate="1997" isbn="1-86001-57-5"> <title>Pride And Prejudice</title> <price>24.95</price> </book> <book id="2" genre="business" publicationdate="2003" isbn="4-746623-03-2" > <title>Custumor Manager</title> <price>31.44</price> </book> </store>
2、新建一個Windows控制臺應用程序,命名為"EditElement",在Main方法中編寫主程序,代碼如下:
static void Main(string[] args) { XmlDocument doc = new XmlDocument(); doc.Load(@"C:\book.xml"); XmlElement root = doc.DocumentElement; //創建並添加XmlElement實例到XmlDocument類實例中 XmlElement elm = doc.CreateElement("Author"); elm.InnerText ="Jane"; root.SelectSingleNode("/store/book[@id=1]").AppendChild(elm); Console.WriteLine(elm.ParentNode.InnerXml); //修改XmlElement類實例的屬性 XmlElement newelm = doc.CreateElement("Author"); XmlAttribute attr = doc.CreateAttribute("firstname"); attr.Value = "Jane"; newelm.SetAttributeNode(attr); root.SelectSingleNode("/store/book[@id=1]").ReplaceChild(newelm,elm); Console.WriteLine(newelm.ParentNode.InnerXml); //刪除XmlElement類實例 root.SelectSingleNode("/store/book[@id=1]").RemoveChild(newelm); Console.WriteLine(root.SelectSingleNode("/store/book[@id=1]").InnerXml); Console.ReadLine(); }
XPath的學習: http://www.w3school.com.cn/xpath/
XmlNode與XmlElement的區別總結