XML檔案解析器TXml

2021-09-08 16:41:34 字數 2338 閱讀 5406

前幾天看了開源的xml檔案解析器tinyxml,它是怎麼實現解析的沒怎麼看懂,於是決定自己實現乙個,反正最近不忙。先命名為txml。現在完成了解析和查詢功能,全部**加起來不到1000行,將會繼續完善它。原始碼必共享

先簡單說一下我的思路:

1:讀取xml檔案資訊,並存入乙個字元陣列中;

2:遍歷陣列,將陣列解析成一棵樹;

3:以路徑的方式查詢和按屬性查詢;

這個解析器最麻煩的地方就在怎麼將字元陣列解析成一顆樹。我們先看一下乙個簡單xml檔案,他包括檔案頭、節點、節點名稱及節點值、屬性名稱及屬性值,子節點、父節點、注釋等。

xml version="1.0" encoding="utf-8" 

?>

<

items

>

<

item

name

="c******han"

>89757

item

>

items

>

簡單介紹一下解析的實現,不太好說清楚,看**可能更容易理解一些。遞迴實現,每次都從乙個節點開始解析,就是從字元「」結束,字元《後面就是節點的名稱,之後的就是節點屬性,字元》後乙個字元如果不是

const

char* txmlparser::parsecontent(const

char* p,xmlnode*basenode)

if(*p=='

/')//

結束節點

++p=skipwhitespace(p);

parsecontent(p,basenode->parent);//

新節點 }else

xmlnode* node=new

xmlnode(name,basenode);

if(*p=='

>')

else

else

} }

}else

}

按路徑的方式查詢。利用兩個陣列實現,假設這兩個陣列分別為a,b;第一次查詢將結果存入陣列a,將a作為資料來源,將查詢結果存入b,清除a中的資料,將b作為資料來源,將查詢結果存入a,反覆進行,最後a,b中有乙個就是查詢結果。當然也可以用遞迴實現,我們都知道遞迴太深容易爆執行緒棧,且效能低。

按屬性查詢。同樣沒有用遞迴實現,有個經常出現的面試題:按層序列印乙個棵樹。那麼這裡也是按層序查詢,就是利用乙個佇列,按根節點、根節點的直接子節點進棧,乙個個匹配,不匹配就出佇列。

//

根據屬性查詢--利用佇列按層序查詢

xmlnode* xmlnode::selectsinglenodebyattr(const

string& attrname,const

string& attrvalue,xmlnode*node)

queue

list;

for(int i=node->childcount()-1;i>=0;i--)

while(list.size()>0

)

for(int i=tmpnode->childcount()-1;i>=0;i--)

list.pop();

} return

null;

}

看了按屬性查詢,我們就很容易知道,c#中configurationmanager讀取配置檔案的大致實現,因為配置檔案很簡單,就是乙個節點下面有多個節點,完全可以這樣實現,根節點基本可以無視,直接就是乙個字典,key存key的值,value存value的值,查詢的時間複雜度就是o(1)。

簡單測試:

#include "

xmldocument.h

"int

main()

}

cout

<

查詢name=『英文』的節點:

"<

xmlnode* node2=doc.selectsinglenodebyattr("

name

","英文");

if(node2!=null)

}system(

"pause");

return0;

}

執行結果如下:

未完...待續...功能將會更加豐富,我們都值得期待!

XML檔案解析器TXml

前幾天看了開源的xml檔案解析器tinyxml,它是怎麼實現解析的沒怎麼看懂,於是決定自己實現乙個,反正最近不忙。先命名為txml。現在完成了解析和查詢功能,全部 加起來不到1000行,將會繼續完善它。原始碼必共享 先簡單說一下我的思路 1 讀取xml檔案資訊,並存入乙個字元陣列中 2 遍歷陣列,將...

pull解析器解析xml

利用pull解析xml檔案需要下面幾個步驟 1 獲取xmlpullparser物件。這裡有兩個方法 通過xmlpullparse ctory獲取xmlpullparser物件,或者直接使用xml.newpullparser 方法獲取。栗子如 一所示。2 通過xmlpullparser物件設定輸入流。...

XML解析 Jsoup解析器

jsoup快捷查詢方式 jsoup概念 跳轉到目錄 jsoup基本使用 提取碼 0uvi 獲取document物件 獲取對應標籤的element物件 獲取資料 public static void getfirstname throws exception jsoup中的物件 跳轉到目錄 獲取對應的...