內容提要
1.解析xml檔案有哪些方法?各有什麼優缺點?
2.如何用xpath解析xml文件的要點。
先來看看解析xml檔案的方法都有哪些吧,本段文字來自網路,可以幫助大家對這個問題有個概要的了解。
在程式中訪問並操作xml檔案一般有兩種模型:流模型和dom(文件物件模型)。流模型中有兩種變體——「推」模型和「拉」模型。
「推」模型也就是常說的sax,sax是一種靠事件驅動的模型。它每發現乙個節點就用「推」模型引發乙個事件,而我們必須編寫這些事件的處理程式,很麻煩。
.net中使用的是基於「拉」模型的實現方案。 「拉」模型在遍歷文件時會把感興趣的文件部分從讀取器中拉出,不需要引發事件,允許我們以程式設計的方式訪問文件,這大大的提高了靈活性,「拉」模型可以選擇性的處理節點。在.net中,「拉」模型通過xml閱讀器(xmltextreader類)來實現的。該類提供xml檔案讀取的功能,它可以驗證文件是否格式良好,如果不是格式良好的xml文件,該類在讀取過程中將會丟擲xmlexception異常。任何時候在記憶體中只有當前節點,但它是唯讀的,向前的,不能在文件中執行向後導航操作。
dom的好處在於它允許編輯和更新xml文件,可以隨機訪問文件中的資料,可以使用xpath查詢。但是,dom的缺點在於它需要一次性的載入整個文件到記憶體中,對於大型的文件,這會造成資源問題。在.net中使用xml dom分析器(xmldocument)實現dom模型。
因此,.net framework完全支援xml dom模式,但它不支援sax模式。.net framework支援兩種不同的分析模式:xml dom分析器(xmldocument類)和xml閱讀器(xmltextreader類),不支援sax分析器, 但這並不意味著它沒有提供類似sax分析器的功能。通過xml閱讀器可以將sax的所有的功能很容易的實現及更有效的運用。
在專案中,我們選用xpath的方式來解析xml文件。這是基於以下的幾點原因:
1, 檔案大小。要處理的檔案不大,一般都在幾百k到1m。
2, xpath的靈活性。不需要獲取文件的全部資料,只需要獲取大部分想要的資料。
3, 學習代價低。符合一般的思維習慣,通過path獲取結果。
通過xpath的方式解析xml文件,需要先載入文件,然後再讀取想要的節點值。
xml文件
protected xmldocument doc = null;
xml文件的根元素(節點)
protected xmlelement root = null;
xml文件的名空間管理器
protected xmlnamespacemanager nsmgr = null;
接下來就是載入文件了
protected void loadxmlfile(fileinfo xmlfile)
。",xmlfile.fullname));
}
//載入檔案
this.doc = new xmldocument();
doc.load(xmlfile.fullname);
//準備讀取檔案
root = doc.documentelement;
string namespace = root.namespaceuri;
nsmgr = new xmlnamespacemanager(doc.nametable);
nsmgr.addnamespace("ns", namespace);
}
這裡有幾行要注意。
這兩行是取得xml文件的名空間
root = doc.documentelement;
string namespace = root.namespaceuri;
複製**
這兩行是建立xml文件的名空間管理器
nsmgr = new xmlnamespacemanager(doc.nametable);
nsmgr.addnamespace("ns", namespace);
複製**
如果你的xml文件有名空間,則這部分的**是必不可少的。
接下來就是讀取文件節點的值了
這裡兩個傳入引數prefixpath是節點的上級節點路徑,xrelativepath是要讀取的節點名稱。
另外,變數xmlfileinfo是要載入的xml檔案。
可能有的朋友要問,為什麼要設定兩個引數prefixpath和xrelativepath呢,其實這個沒有多大的關係,我只是為了自己覺得方便,你也可以在方法外確定了這個xpath,在方法中只設定乙個傳入引數,效果是一樣的。
注意這一行:
xpath = xpath.replace("/", "/ns:");
如果你的xml文件帶名空間,則這行是比不可少的,否則會出現找不到節點,無法解析的情況。
這裡還有乙個不得不說的問題,就是關於xpath的。
對於這樣乙個xml文件,要查詢第乙個節點下的學生的name時(id=01),其xpath應該是"/ns:root/ns:students/ns:student[1]/ns:name"。xml對於重複的節點名稱,是按照順序1,2,3...的方式遍歷的,也就是說如果要找第n個student節點的下的節點之,那麼應使用student[n]的標識方式。
當然,這裡也可以獲取節點屬性的值,查詢滿足特定值的節點等等,這些和上面獲取節點值的過程是類似的。這裡推薦一篇介紹xpath的文章xpath 教程,大家不妨看看,關於xpath的常見問題都可以得到解決。
分類:
.net
標籤:
.net,
c#,
xml,
xpath
綠色通道:
好文要頂
關注我收藏該文
與我聯絡
春風沉醉的晚上
關注 - 0
粉絲 - 1
+加關注
3
0
(請您對文章做出評價)
« 博主前一篇:
sql server 2005儲存過程開發的一點經驗
» 博主後一篇:
c#檔案操作
posted @ 2009-06-03 16:33
春風沉醉的晚上 閱讀(5422)
編輯收藏
C 解析XML檔案
我在這裡使用xmldocument通過using system.xml命名空間 xmldocument xml newxmldocument 先例項化 xmldocument xml.load path path可以為相對路徑或者為絕對路徑 xmlnodelist province xml.docu...
C 解析XML檔案
解析xml檔案 最近在使用c 處理gf 3和radarsat 2雷達影像,需要通過解析xml檔案獲取影像時間,我選用了 tinyxml庫來解析。參考了網上的一些教程,這個文件個人覺得是解釋的很清晰的。第一次使用記錄一下學習過程,供以後參考。先看一下xml檔案內容。下面這個是radarsat 2影像的...
建立xml檔案 解析xml檔案
import codecs import xml.dom.minidom doc xml.dom.minidom.document print doc root doc.createelement booklist print u 新增的xml標籤為 root.tagname root.setatt...