C 解析XML檔案

2021-06-03 18:24:13 字數 3102 閱讀 7146

內容提要

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...