XmlDocument類是.NET框架的DOC解析器。XmlDocument將XML視為樹狀結構,它裝載XML文檔,並在內存中構建該文檔的樹狀結構。下面來看下XmlDocument提供了哪些功能。
一、屬性:
Attributes 獲取一個 XmlAttributeCollection,它包含該節點的屬性。 (繼承自 XmlNode。)
BaseURI 獲取當前節點的基 URI。 (重寫 XmlNode..::.BaseURI。)
ChildNodes 獲取節點的所有子節點。 (繼承自 XmlNode。)
DocumentElement 獲取文檔的根 XmlElement。
DocumentType 獲取包含 DOCTYPE 聲明的節點。
FirstChild 獲取節點的第一個子級。 (繼承自 XmlNode。)
HasChildNodes 獲取一個值,該值指示節點是否有任何子節點。 (繼承自 XmlNode。)
Implementation 獲取當前文檔的 XmlImplementation 對象。
InnerText 獲取或設置節點及其所有子節點的串聯值。 (繼承自 XmlNode。)
InnerXml 獲取或設置表示當前節點子級的標記。 (重寫 XmlNode..::.InnerXml。)
IsReadOnly 獲取一個值,該值指示當前節點是否是只讀的。 (重寫 XmlNode..::.IsReadOnly。)
Item 已重載。
LastChild 獲取節點的最後一個子級。 (繼承自 XmlNode。)
LocalName 獲取節點的本地名稱。 (重寫 XmlNode..::.LocalName。)
Name 獲取節點的限定名。 (重寫 XmlNode..::.Name。)
NamespaceURI 獲取該節點的命名空間 URI。 (繼承自 XmlNode。)
NameTable 獲取與此實現關聯的 XmlNameTable。
NextSibling 獲取緊接在該節點之後的節點。 (繼承自 XmlNode。)
NodeType 獲取當前節點的類型。 (重寫 XmlNode..::.NodeType。)
OuterXml 獲取表示此節點及其所有子節點的標記。 (繼承自 XmlNode。)
OwnerDocument 獲取當前節點所屬的 XmlDocument。 (重寫 XmlNode..::.OwnerDocument。)
ParentNode 已重載。
Prefix 獲取或設置該節點的命名空間前綴。 (繼承自 XmlNode。)
PreserveWhitespace 獲取或設置一個值,該值指示是否在元素內容中保留空白。
PreviousSibling 獲取緊接在該節點之前的節點。 (繼承自 XmlNode。)
SchemaInfo 返回節點的後架構驗證信息集 (PSVI)。 (重寫 XmlNode..::.SchemaInfo。)
Schemas 獲取或設置與此 XmlDocument 關聯的 XmlSchemaSet 對象。
Value 獲取或設置節點的值。 (繼承自 XmlNode。)
XmlResolver 設置 XmlResolver 以用於解析外部資源。
二、方法
AppendChild 將指定的節點添加到該節點的子節點列表的末尾。 (繼承自 XmlNode。)
Clone 創建此節點的一個副本。 (繼承自 XmlNode。)
CloneNode 創建此節點的一個副本。 (重寫 XmlNode..::.CloneNode(Boolean)。)
CreateAttribute 已重載。 創建具有指定名稱的 XmlAttribute。
CreateCDataSection 創建包含指定數據的 XmlCDataSection。
CreateComment 創建包含指定數據的 XmlComment。
CreateDefaultAttribute 創建具有指定前綴、本地名稱和命名空間 URI 的默認屬性。
CreateDocumentFragment 創建 XmlDocumentFragment。
CreateDocumentType 返回新的 XmlDocumentType 對象。
CreateElement 已重載。 創建 XmlElement。
CreateEntityReference 創建具有指定名稱的 XmlEntityReference。
CreateNavigator 已重載。 創建一個用於導航此文檔的新 XPathNavigator 對象。
CreateNode 已重載。 創建 XmlNode。
CreateProcessingInstruction 創建一個具有指定名稱和數據的 XmlProcessingInstruction。
CreateSignificantWhitespace 創建一個 XmlSignificantWhitespace 節點。
CreateTextNode 創建具有指定文本的 XmlText。
CreateWhitespace 創建一個 XmlWhitespace 節點。
CreateXmlDeclaration 創建一個具有指定值的 XmlDeclaration 節點。
GetElementById 獲取具有指定 ID 的 XmlElement。
GetElementsByTagName 已重載。 返回一個 XmlNodeList,它包含與指定名稱匹配的所有子代元素的列表。
GetEnumerator 提供對 XmlNode 中節點上“for each”樣式迭代的支持。 (繼承自 XmlNode。)
GetHashCode 用作特定類型的哈希函數。 (繼承自 Object。)
GetNamespaceOfPrefix 查找當前節點范圍內離給定的前綴最近的 xmlns 聲明,並返回聲明中的命名空間 URI。 (繼承自 XmlNode。)
GetPrefixOfNamespace 查找當前節點范圍內離給定的命名空間 URI 最近的 xmlns 聲明,並返回聲明中定義的前綴。 (繼承自 XmlNode。)
ImportNode 將節點從另一個文檔導入到當前文檔。
InsertAfter 將指定的節點緊接著插入指定的引用節點之後。 (繼承自 XmlNode。)
InsertBefore 將指定的節點緊接著插入指定的引用節點之前。 (繼承自 XmlNode。)
Load 已重載。 從 Stream、URL、TextReader 或 XmlReader 加載指定的 XML 數據。
LoadXml 從指定的字符串加載 XML 文檔。
Normalize 將此 XmlNode 下子樹完全深度中的所有 XmlText 節點都轉換成“正常”形式,在這種形式中只有標記(即標記、注釋、處理指令、 CDATA 節和實體引用)分隔 XmlText 節點,也就是說,沒有相鄰的 XmlText 節點。 (繼承自 XmlNode。)
PrependChild 將指定的節點添加到該節點的子節點列表的開頭。 (繼承自 XmlNode。)
ReadNode 根據 XmlReader 中的信息創建一個 XmlNode 對象。讀取器必須定位在節點或屬性上。
RemoveAll 移除當前節點的所有子節點和/或屬性。 (繼承自 XmlNode。)
RemoveChild 移除指定的子節點。 (繼承自 XmlNode。)
ReplaceChild 用 newChild 節點替換子節點 oldChild。 (繼承自 XmlNode。)
Save 已重載。 將 XML 文檔保存到指定的位置。
SelectNodes 已重載。
SelectSingleNode 已重載。
Supports 測試 DOM 實現是否實現特定的功能。 (繼承自 XmlNode。)
Validate 已重載。 驗證 XmlDocument 是不是 Schemas 屬性中包含的 XML 架構定義語言 (XSD) 架構。
WriteContentTo 將 XmlDocument 節點的所有子級保存到指定的 XmlWriter 中。 (重寫 XmlNode..::.WriteContentTo(XmlWriter)。)
WriteTo 將 XmlDocument 節點保存到指定的 XmlWriter。 (重寫 XmlNode..::.WriteTo(XmlWriter)。)
三、事件
NodeChanged 當屬於該文檔的節點的 Value 已被更改時發生。
NodeChanging 當屬於該文檔的節點的 Value 將被更改時發生。
NodeInserted 當屬於該文檔的節點已被插入另一個節點時發生。
NodeInserting 當屬於該文檔的節點將被插入另一個節點時發生。
NodeRemoved 當屬於該文檔的節點已被從其父級移除時發生。
NodeRemoving 當屬於該文檔的節點將被從文檔中移除時發生。
助記屬性:
PreviousSibling 上一個兄弟節點
NextSibling 下一個兄弟節點
FirstChild 第一個子節點
LastChild 最後一個子節點
ChildNodes 子節點集合
ParentNode 父節點
代碼示例:
xml文檔:
復制代碼 代碼如下:
<?xml version="1.0" encoding="utf-8" ?>
<Article>
<author age="30">張三</author>
<length>12000</length>
<price>42</price>
</Article>
代碼:
復制代碼 代碼如下:
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\Test.xml");
//先獲取一個唯一的Article節點,再獲取其下的第一個子節點 然後再獲取該節點下的屬性集合
XmlAttributeCollection xc = doc.SelectSingleNode("Article").FirstChild.Attributes;
string age = xc[0].Value; //不過是一個定制的集合罷了,還是集合那套東西 //string age = xc["age"].Value; 支持兩種索引訪問
Console.WriteLine(age); //輸出30
string baseuri = doc.SelectSingleNode("Article").FirstChild.BaseURI;
Console.WriteLine(baseuri); //輸出 file:///C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\Test.xml
XmlNodeList listNode = doc.SelectSingleNode("Article").ChildNodes; //獲取Article節點下的所有節點列表
for (int i = 0; i < listNode.Count;i++ ) //XmlNodeList不支持foreach遍歷,只能用for
{
Console.Write(listNode[i].Name + " : " + listNode[i].InnerText); //輸出 author:張三 length:12000 price:30 Name獲取的是限定名,也就是標記名稱
}
XmlElement xe = doc.DocumentElement; //獲取根節點
Console.WriteLine(xe.Name); //輸出 Article
//XmlDocumentType xdt = doc.DocumentType; //獲取包含 DOCTYPE 聲明的節點。應該是由DTD限定的節點。
//Console.Write(xdt.Name); //此處報 未將對象引用設置到對象的實例,因為找不到有DOCTYPE聲明的元素
Console.WriteLine(doc.HasChildNodes); //輸出 True 當前Document是否包含子節點。
//XmlImplementation xi = doc.Implementation; //不懂怎麼用
//xi.ToString();
Console.WriteLine(doc.InnerText); //獲取當前文檔的內容 輸出 張三 12000 30
Console.WriteLine(doc.InnerXml); //輸出 整個Xml文件的字符串內容
Console.WriteLine(doc.IsReadOnly); //獲取當前文檔是否是只讀的。輸出 False
XmlNode node = doc.LastChild;
Console.WriteLine(node.InnerText); //輸出 張三 12000 30 因為最後一個節點是Article節點,輸出Article節點的所有內容
Console.WriteLine(doc.LocalName); //輸出 #document
Console.WriteLine(doc.SelectSingleNode("Article").Name); //輸出Article
Console.WriteLine(doc.SelectSingleNode("Article").FirstChild.NextSibling.Name); //length author的下一個兄弟節點 是length
XmlNodeType xnt = doc.SelectSingleNode("Article").NodeType;
Console.WriteLine(xnt); //輸出Element,表明該節點是元素節點
string str = doc.SelectSingleNode("Article").OuterXml; //此節點及其所有自己點標記,輸出Article節點的所有內容 <Article>省略...</Article>
Console.WriteLine(str);
XmlDocument x = new XmlDocument();
x.LoadXml(str);
Console.WriteLine(doc.SelectSingleNode("Article").OwnerDocument); //獲取該節點所屬的XmlDocument
XmlNode xn = doc.SelectSingleNode("Article").LastChild.ParentNode; //ParentNode獲取直接父節點。
Console.WriteLine(xn.Name); //輸出 Article
Console.WriteLine(doc.PreserveWhitespace); //是否保留空白 輸出False
XmlNode xn1 = doc.SelectSingleNode("Article").LastChild.PreviousSibling;
Console.WriteLine(xn1.Name); //輸出length 的確是最後一個節點的前一個節點。
Console.ReadKey();
}
為了更加好的展示一些屬性,現在將xml換成這樣:
復制代碼 代碼如下:
<?xml version="1.0" encoding="utf-8" ?>
<h:Article xmlns:h = "http://www.xxx.com/">
<!--默認命名空間-->
<h:author age="30">張三</h:author>
<h:length>12000</h:length>
<h:price>42</h:price>
</h:Article>
代碼如下:
復制代碼 代碼如下:
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\Test.xml");
XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable);
xnm.AddNamespace("h", "http://www.xxx.com/");
XmlNode Article = doc.SelectSingleNode("h:Article", xnm);
string namespace1 = Article.InnerText;
Console.WriteLine(namespace1); //輸出 張三 12000 30
Console.WriteLine(Article.Prefix); //輸出 h 獲取當前節點的前綴
Console.WriteLine(Article.NamespaceURI); //輸出 http://www.xxx.com/123 獲取當前節點所在的命名空間
Console.WriteLine(Article.FirstChild.Name + "---" + Article.FirstChild.Value + "---" + Article.FirstChild.LocalName);
//以上一行代碼輸出 h:author------author
//SchemaInfo 返回節點的後架構驗證信息集 (PSVI)。//Value 獲取或設置節點的值。 (繼承自 XmlNode。)
//XmlResolver 設置 XmlResolver 以用於解析外部資源。
Console.ReadKey();
}
再來一個展示一下Schemas這個常用的屬性
復制代碼 代碼如下:
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument(); //創建文檔
doc.Schemas.Add(null, @"C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\person.xsd"); //添加一個架構對象到本XmlDocument
doc.Load(@"C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\person.xml"); //加載xml文件
Console.WriteLine(doc.Schemas.Count); //輸出1 就是第二行添加的那個
Console.WriteLine(doc.SchemaInfo.MemberType);
//XmlResolver 設置 XmlResolver 以用於解析外部資源。
Console.ReadKey();
}
下面來試下XmlDocument的方法
Test.xml的代碼如下:
復制代碼 代碼如下:
<?xml version="1.0" encoding="utf-8" ?>
<bookstore>
<book>
<id>1</id>
<title lang="屬性1">三國演義</title>
<author>羅貫中</author>
<year>2005</year>
<price id='a1"'>38.5</price>
</book>
<book>
<id>2</id>
<title lang="屬性2">西游記</title>
<author>吳承恩</author>
<year>2004</year>
<price>37.5</price>
</book>
</bookstore>
主程序代碼如下:
復制代碼 代碼如下:
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument(); //創建文檔
doc.Load(@"C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\Test.xml"); //加載xml文件
XmlNode node1 = doc.CreateNode(XmlNodeType.Element, "pagecount", null);
node1.InnerText = "222";
doc.SelectSingleNode("/bookstore").AppendChild(node1); //執行之後 <pagecount>222</pagecount>元素被添加到</bookstore>前面
doc.Save(@"D:\123.xml");
XmlNode node2 = doc.SelectSingleNode("/bookstore/book[1]/title[1]").Clone(); //克隆一個節點出來
Console.WriteLine(node2.InnerText); //輸出三國演義
XmlNode node3 = doc.SelectSingleNode("/bookstore/book[1]/title[1]").CloneNode(true); //參數決定是否克隆子節點數(如果false,文本節點也不克隆)
Console.WriteLine(node3.InnerText); //輸出三國演義
XmlAttribute attr = doc.CreateAttribute("age"); //創建一個age屬性
attr.Value = "23";
doc.SelectSingleNode("/bookstore/book[1]/author[1]").Attributes.Append(attr); //執行之後第一個作者變為 <author age="23">羅貫中</author>
doc.Save(@"D:\123.xml");
XmlCDataSection cdata = doc.CreateCDataSection("我&你");
doc.SelectSingleNode("/bookstore/book[1]/author[1]").AppendChild(cdata); //執行之後author變為<author age="23">羅貫中<![CDATA[我&你]]></author>
doc.Save(@"D:\123.xml");
XmlComment com = doc.CreateComment("2013-2-27 22:37:25");
doc.SelectSingleNode("/bookstore/book[1]/title[1]").AppendChild(com); //執行之後title變為<title lang="屬性1">三國演義<!--2013-2-27 22:37:25--></title>
doc.Save(@"D:\123.xml");
XmlDocument doc1 = new XmlDocument();
XmlDocumentFragment xdf = doc1.CreateDocumentFragment(); //一個xml片段,這個類敢情好用
xdf.InnerXml = "<item>widget</item>";
doc1.AppendChild(xdf);
Console.WriteLine(doc1.OuterXml); //輸出<item>widget</item>
//CreateDefaultAttribute 創建具有指定前綴、本地名稱和命名空間 URI 的默認屬性。
//CreateDocumentType 返回新的 XmlDocumentType 對象。
XmlDocument doc2 = new XmlDocument();
XmlElement element = doc2.CreateElement("title"); //創建一個title 如果現在保存是輸出<title/> 因為還沒有內容
doc2.AppendChild(element);
XmlEntityReference xer = doc2.CreateEntityReference("h");
doc2.LastChild.AppendChild(xer);
Console.WriteLine(doc2.OuterXml); //輸出</title>&h;</title>
XPathNavigator nav = doc2.CreateNavigator(); //一個通過光標的導航模型遍歷XML文檔的數據
XmlText text = doc2.CreateTextNode("你好啊"); //創建一個文本節點
doc2.SelectSingleNode("/title").AppendChild(text);
Console.WriteLine(doc2.OuterXml); //輸出</title>&h;你好啊</title>
XmlWhitespace xws = doc2.CreateWhitespace(" "); //創建一個空白節點
doc2.SelectSingleNode("/title").AppendChild(xws);
Console.WriteLine(doc2.OuterXml); //輸出</title>&h;你好啊 </title>
XmlDeclaration xd = doc2.CreateXmlDeclaration("1.0", "utf-8", "yes"); //xml頭 XML聲明部分
XmlNode root = doc2.SelectSingleNode("/title");
doc2.InsertBefore(xd, root);
Console.WriteLine(doc2.OuterXml); //執行之後 在頭部加入了<?xml version="1.0" encoding="utf-8" standalont="yes"?>
XmlSignificantWhitespace xsw = doc2.CreateSignificantWhitespace(" ");
XmlElement ele = doc2.CreateElement("white");
ele.InnerText = "空白啊空白";
ele.AppendChild(xsw);
doc2.SelectSingleNode("/title").AppendChild(ele);
Console.WriteLine(doc2.OuterXml); //還是添加一大堆空白,不知道與CreateWhitespace有什麼區別
XmlDocument doc3 = new XmlDocument();
String PItext = "type='text/xsl' href='book.xsl'";
XmlProcessingInstruction newPI = doc3.CreateProcessingInstruction("xml-stylesheet", PItext);
doc3.AppendChild(newPI);
Console.WriteLine(doc3.OuterXml); //輸出 <?xml-stylesheet type="text/xsl" hred="book.xsl"?>
//GetElementById 獲取具有指定 ID 的 XmlElement。
//GetElementsByTagName 已重載。 返回一個 XmlNodeList,它包含與指定名稱匹配的所有子代元素的列表。
//GetEnumerator 提供對 XmlNode 中節點上“for each”樣式迭代的支持。 (繼承自 XmlNode。)
//GetNamespaceOfPrefix 查找當前節點范圍內離給定的前綴最近的 xmlns 聲明,並返回聲明中的命名空間 URI。 (繼承自 XmlNode。)
//GetPrefixOfNamespace 查找當前節點范圍內離給定的命名空間 URI 最近的 xmlns 聲明,並返回聲明中定義的前綴。 (繼承自 XmlNode。)
//ImportNode 將節點從另一個文檔導入到當前文檔。
//InsertAfter 將指定的節點緊接著插入指定的引用節點之後。 (繼承自 XmlNode。)
//InsertBefore 將指定的節點緊接著插入指定的引用節點之前。 (繼承自 XmlNode。)
//LoadXml 從指定的字符串加載 XML 文檔。
//Normalize 將此 XmlNode 下子樹完全深度中的所有 XmlText 節點都轉換成“正常”形式,在這種形式中只有標記(即標記、注釋、處理指令、 CDATA 節和實體引用)分隔 XmlText 節點,也就是說,沒有相鄰的 XmlText 節點。 (繼承自 XmlNode。)
//PrependChild 將指定的節點添加到該節點的子節點列表的開頭。 (繼承自 XmlNode。)
//ReadNode 根據 XmlReader 中的信息創建一個 XmlNode 對象。讀取器必須定位在節點或屬性上。
//RemoveAll 移除當前節點的所有子節點和/或屬性。 (繼承自 XmlNode。)
//RemoveChild 移除指定的子節點。 (繼承自 XmlNode。)
//ReplaceChild 用 newChild 節點替換子節點 oldChild。 (繼承自 XmlNode。)
//Supports 測試 DOM 實現是否實現特定的功能。 (繼承自 XmlNode。)
//Validate 已重載。 驗證 XmlDocument 是不是 Schemas 屬性中包含的 XML 架構定義語言 (XSD) 架構。
//WriteContentTo 將 XmlDocument 節點的所有子級保存到指定的 XmlWriter 中。 (重寫 XmlNode..::.WriteContentTo(XmlWriter)。)
//WriteTo 將 XmlDocument 節點保存到指定的 XmlWriter。 (重寫 XmlNode..::.WriteTo(XmlWriter)。)
Console.ReadKey();
}