1. 程式人生 > >XmlNode與XmlElement的區別總結

XmlNode與XmlElement的區別總結

des 主程 格式 類繼承 ace outer tel pat ride

原文鏈接: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類中也是可以使用的。

2、XmlElement是特殊的XmlNode類,Xml節點有多種類型:屬性節點、註釋節點、文本節點、元素節點等。也就是XmlNode是這多種節點的統稱。但是XmlElement專門指的就是元素節點。
3、XmlElement是具現類,可以直接實例化,而XmlNode是抽象類,必須通過XmlDocument實例通過CreateNode創建。
4、XmlElement擁有眾多對Attribute的操作方法,可以方便的對其屬性進行讀寫操作(XmlNode也可以通過Attributes屬性獲取屬性列表)。
5、在網上看到有人這麽評論這兩個類的區別:XmlNode包含子節點,XmlElement只包含屬性及其本身不含有子節點。但是我通過代碼測試,發現 即使是XmlElement,也可以通過ChildNodes來獲取子節點列表。雖然在斷點中斷模式下,我並沒有發現XmlElement有 ChildNodes屬性。舉例如下:
//是XmlNode也是XmlElement,但是img以及aspnet.jpg只是XmlNode
//既是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的區別總結