簡(jiǎn)介C#讀取XML的兩種方式
XML作用
對(duì)于XML,想必各位都比較了解,我也就不用費(fèi)筆墨來描述它是什么了,我想在未來的Web開發(fā)中XML一定會(huì)大放異彩,XML是可擴(kuò)展標(biāo)記語(yǔ)言,使用它企業(yè)可以制定一套自己的數(shù)據(jù)格式。用于Internet的數(shù)據(jù)傳輸,我想,這是XML對(duì)于我們這些程序員最誘人的地方!
我們今天的主題不是論述XML的好處,而是討論在C#中如何使用XML。下面我們來了解一下使用程序訪問XML的一些基礎(chǔ)理論知識(shí)。
訪問的兩種模型:
在程序中訪問進(jìn)而操作XML文件一般有兩種模型,分別是使用DOM(文檔對(duì)象模型)和流模型,使用DOM的好處在于它允許編輯和更新XML文檔,可以隨機(jī)訪問文檔中的數(shù)據(jù),可以使用XPath查詢,但是,DOM的缺點(diǎn)在于它需要一次性的加載整個(gè)文檔到內(nèi)存中,對(duì)于大型的文檔,這會(huì)造成資源問題。流模型很好的解決了這個(gè)問題,因?yàn)樗鼘?duì)XML文件的訪問采用的是流的概念,也就是說,任何時(shí)候在內(nèi)存中只有當(dāng)前節(jié)點(diǎn),但它也有它的不足,它是只讀的,僅向前的,不能在文檔中執(zhí)行向后導(dǎo)航操作。雖然是各有千秋,但我們也可以在程序中兩者并用實(shí)現(xiàn)優(yōu)劣互補(bǔ)嘛,呵呵
一、DOM文檔對(duì)象模型操作
using System.Xml;
XmlDocument xml=new XmlDocument();//初始化一個(gè)xml實(shí)例
xml.Load(path);//導(dǎo)入指定xml文件
xml.Load(HttpContext.Current.Server.MapPath("~/file/bookstore.xml"));XmlNode root=xml.SelectSingleNode("/root");//指定一個(gè)節(jié)點(diǎn)
XmlNodeList childlist=root.ChildNodes;//獲取節(jié)點(diǎn)下所有直接子節(jié)點(diǎn)
XmlNodeList nodelist=xml.SelectNodes("/Root/News");//獲取同名同級(jí)節(jié)點(diǎn)集合string id=node.Attributes["id"].Value;//獲取指定節(jié)點(diǎn)的指定屬性值
string content=node.InnerText;//獲取指定節(jié)點(diǎn)中的文本
root.HasChildNodes;//判斷該節(jié)點(diǎn)下是否有子節(jié)點(diǎn)
1.XmlDocument類的屬性
XmlDocument類的屬性及說明如下表所示。
|
屬性 |
說明 |
|
Attributes |
當(dāng)前節(jié)點(diǎn)的屬性集合 |
|
BaseURI |
當(dāng)前節(jié)點(diǎn)的基URI |
|
ChildNodes |
節(jié)點(diǎn)的所有子節(jié)點(diǎn) |
|
DocumentElement |
文檔的根 |
|
DocumentType |
DOCTYPE 聲明的節(jié)點(diǎn) |
|
FirstChild |
節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn) |
|
HasChildNodes |
是否有任何子節(jié)點(diǎn) |
|
Implementation |
獲取當(dāng)前文檔的 XmlImplementation對(duì)象 |
|
InnerText |
節(jié)點(diǎn)包含的所有文本內(nèi)容 |
|
InnerXml |
節(jié)點(diǎn)所包含的所有XML內(nèi)容 |
|
IsReadOnly |
當(dāng)前節(jié)點(diǎn)是否是只讀的 |
|
Item |
獲取指定的子元素 |
|
LastChild |
最后一個(gè)子節(jié)點(diǎn) |
|
LocalName |
獲取節(jié)點(diǎn)的本地名稱 |
|
Name |
獲取節(jié)點(diǎn)的限定名 |
|
NamespaceURI |
獲取該節(jié)點(diǎn)的命名空間 URI |
|
NameTable |
獲取與此實(shí)現(xiàn)關(guān)聯(lián)的 XmlNameTable |
|
NextSibling |
獲取緊接在該節(jié)點(diǎn)之后的節(jié)點(diǎn) |
|
NodeType |
獲取當(dāng)前節(jié)點(diǎn)的類型 |
|
OuterXml |
獲取表示此節(jié)點(diǎn)及其所有子節(jié)點(diǎn)的標(biāo)記 |
|
OwnerDocument |
獲取當(dāng)前節(jié)點(diǎn)所屬的 XmlDocument |
|
ParentNode |
獲取該節(jié)點(diǎn)(對(duì)于可以具有父級(jí)的節(jié)點(diǎn))的父級(jí) |
|
Prefix |
獲取或設(shè)置該節(jié)點(diǎn)的命名空間前綴 |
|
PreserveWhitespace |
獲取或設(shè)置一個(gè)值,該值指示是否在元素內(nèi)容中保留空白 |
|
PreviousSibling |
獲取緊接在該節(jié)點(diǎn)之前的節(jié)點(diǎn) |
|
SchemaInfo |
返回節(jié)點(diǎn)的后架構(gòu)驗(yàn)證信息集 (PSVI) |
|
Schemas |
獲取或設(shè)置與此 XmlDocument 關(guān)聯(lián)的 XmlSchemaSet 對(duì)象 |
|
Value |
獲取或設(shè)置節(jié)點(diǎn)的值 |
|
XmlResolver |
設(shè)置 XmlResolver 以用于解析外部資源 |
2.XmlDocument類的方法
XmlDocument類的方法及說明如下表所示。
|
方法 |
說明 |
|
AppendChild |
將指定的節(jié)點(diǎn)添加到該節(jié)點(diǎn)的子節(jié)點(diǎn)列表的末尾 |
|
CreateAttribute |
創(chuàng)建具有指定名稱的 XmlAttribute |
|
CreateCDataSection |
創(chuàng)建包含指定數(shù)據(jù)的 XmlCDataSection |
|
CreateComment |
創(chuàng)建包含指定數(shù)據(jù)的 XmlComment |
|
CreateDocumentFragment |
創(chuàng)建 XmlDocumentFragment |
|
CreateDocumentType |
返回新的 XmlDocumentType 對(duì)象 |
|
CreateElement |
創(chuàng)建 XmlElement |
|
CreateEntityReference |
創(chuàng)建具有指定名稱的 XmlEntityReference |
|
CreateNavigator |
創(chuàng)建一個(gè)用于導(dǎo)航此文檔的新 XPathNavigator 對(duì)象 |
|
CreateNode |
創(chuàng)建 XmlNode |
|
CreateProcessingInstruction |
創(chuàng)建一個(gè)具有指定名稱和數(shù)據(jù)的 XmlProcessingInstruction |
|
CreateSignificantWhitespace |
創(chuàng)建一個(gè) XmlSignificantWhitespace 節(jié)點(diǎn) |
|
CreateTextNode |
創(chuàng)建具有指定文本的 XmlText |
|
CreateWhitespace |
創(chuàng)建一個(gè) XmlWhitespace 節(jié)點(diǎn) |
|
CreateXmlDeclaration |
創(chuàng)建一個(gè)具有指定值的 XmlDeclaration 節(jié)點(diǎn) |
|
GetElementById |
獲取具有指定 ID 的 XmlElement |
|
GetElementsByTagName |
返回一個(gè) XmlNodeList ,它包含與指定名稱匹配的所有元素的列表 |
|
GetNamespaceOfPrefix |
查找當(dāng)前節(jié)點(diǎn)范圍內(nèi)離給定的前綴最近的 xmlns 聲明,并返回聲明中的命名空間 URI |
|
GetPrefixOfNamespace |
查找當(dāng)前節(jié)點(diǎn)范圍內(nèi)離給定的命名空間 URI 最近的 xmlns 聲明,并返回聲明中定義的前綴 |
|
GetType |
獲取當(dāng)前實(shí)例的 Type |
|
ImportNode |
將節(jié)點(diǎn)從另一個(gè)文檔導(dǎo)入到當(dāng)前文檔 |
|
InsertAfter |
將指定的節(jié)點(diǎn)緊接著插入指定的引用節(jié)點(diǎn)之后 |
|
InsertBefore |
將指定的節(jié)點(diǎn)緊接著插入指定的引用節(jié)點(diǎn)之前 |
|
Load |
加載指定的 XML 數(shù)據(jù) |
|
LoadXml |
從指定的字符串加載 XML 文檔 |
|
Normalize |
將XmlText 節(jié)點(diǎn)都轉(zhuǎn)換成“正常”形式 |
|
PrependChild |
將指定的節(jié)點(diǎn)添加到該節(jié)點(diǎn)的子節(jié)點(diǎn)列表的開頭 |
|
ReadNode |
根據(jù) XmlReader 中的信息創(chuàng)建一個(gè) XmlNode 對(duì)象。讀取器必須定位在節(jié)點(diǎn)或?qū)傩陨?/P> |
|
RemoveAll |
移除當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn)和/或?qū)傩?/P> |
|
RemoveChild |
移除指定的子節(jié)點(diǎn) |
|
ReplaceChild |
用新節(jié)點(diǎn)替換舊節(jié)點(diǎn) |
|
Save |
將 XML 文檔保存到指定的位置 |
|
SelectNodes |
選擇匹配XPath 表達(dá)式的節(jié)點(diǎn)列表 |
|
SelectSingleNode |
選擇匹配 XPath 表達(dá)式的第一個(gè) XmlNode |
|
Supports |
測(cè)試 DOM 實(shí)現(xiàn)是否實(shí)現(xiàn)特定的功能 |
|
Validate |
驗(yàn)證 XmlDocument 是不是 Schemas 屬性中包含的 XML 架構(gòu)定義語(yǔ)言 (XSD) 架構(gòu)。 |
|
WriteContentTo |
將 XmlDocument 節(jié)點(diǎn)的所有子級(jí)保存到指定的 XmlWriter 中 |
|
WriteTo |
將 XmlDocument 節(jié)點(diǎn)保存到指定的 XmlWriter |
下面對(duì)常用的方法進(jìn)行介紹。
(1)Load方法
該方法可以從一個(gè)字符串指定的XML文件或是一個(gè)流對(duì)象、一個(gè)TextReader對(duì)象、一個(gè)XmlReader對(duì)象導(dǎo)入XML數(shù)據(jù)。
(2)LoadXml方法
該方法完成從一個(gè)特定的XML文件導(dǎo)入XML數(shù)據(jù)的功能。默認(rèn)情況下,LoadXml 方法既不保留空白,也不保留有意義的空白。此方法不執(zhí)行 DTD 或架構(gòu)驗(yàn)證。
(3)Save方法
該方法將XML數(shù)據(jù)保存到一個(gè)XML文件或是一個(gè)流對(duì)象、一個(gè)TextReader對(duì)象、一個(gè)XmlReader對(duì)象導(dǎo)入XML數(shù)據(jù)。
3.XmlDocument類的事件
XmlDocument類的事件及說明如下表所示。
表 XmlDocument類的事件及說明
|
事件 |
說明 |
|
NodeChanged |
當(dāng)屬于該文檔的節(jié)點(diǎn)的 Value已被更改時(shí)發(fā)生 |
|
NodeChanging |
當(dāng)屬于該文檔的節(jié)點(diǎn)的 Value 將被更改時(shí)發(fā)生 |
|
NodeInserted |
當(dāng)屬于該文檔的節(jié)點(diǎn)已被插入另一個(gè)節(jié)點(diǎn)時(shí)發(fā)生 |
|
NodeInserting |
當(dāng)屬于該文檔的節(jié)點(diǎn)將被插入另一個(gè)節(jié)點(diǎn)時(shí)發(fā)生 |
|
NodeRemoved |
當(dāng)屬于該文檔的節(jié)點(diǎn)已被從其父級(jí)移除時(shí)發(fā)生 |
|
NodeRemoving |
當(dāng)屬于該文檔的節(jié)點(diǎn)將被從文檔中移除時(shí)發(fā)生 |
http://kb.cnblogs.com/page/42226/
相關(guān)文章
C#創(chuàng)建及訪問網(wǎng)絡(luò)硬盤的實(shí)現(xiàn)
本文主要介紹了C#創(chuàng)建及訪問網(wǎng)絡(luò)硬盤的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
通過?C#/VB.NET?代碼將?Excel?工作表拆分為單獨(dú)的文件
這篇文章主要介紹了通過C#/VB.NET代碼將Excel工作表拆分為單獨(dú)的文件,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
C#實(shí)現(xiàn)AddRange為數(shù)組添加多個(gè)元素的方法
這篇文章主要介紹了C#實(shí)現(xiàn)AddRange為數(shù)組添加多個(gè)元素的方法,實(shí)例分析了AddRange方法的使用技巧,需要的朋友可以參考下2015-06-06
C#無法打開計(jì)算機(jī)“.”上的 IISADMIN 服務(wù)的解決方法
在使用c#進(jìn)行控制IIS服務(wù)啟動(dòng)停止的時(shí)候,提示:無法打開計(jì)算機(jī)“.”上的 IISADMIN 服務(wù)2015-01-01
C#實(shí)現(xiàn)文件篩選讀取并翻譯的自動(dòng)化工具
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)文件篩選及讀取內(nèi)容,并翻譯的自動(dòng)化工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-03-03
unity實(shí)現(xiàn)物體延時(shí)出現(xiàn)
這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)物體延時(shí)出現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04

