前幾天看了開源的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按路徑的方式查詢。利用兩個陣列實現,假設這兩個陣列分別為a,b;第一次查詢將結果存入陣列a,將a作為資料來源,將查詢結果存入b,清除a中的資料,將b作為資料來源,將查詢結果存入a,反覆進行,最後a,b中有乙個就是查詢結果。當然也可以用遞迴實現,我們都知道遞迴太深容易爆執行緒棧,且效能低。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
}
按屬性查詢。同樣沒有用遞迴實現,有個經常出現的面試題:按層序列印乙個棵樹。那麼這裡也是按層序查詢,就是利用乙個佇列,按根節點、根節點的直接子節點進棧,乙個個匹配,不匹配就出佇列。
//看了按屬性查詢,我們就很容易知道,c#中configurationmanager讀取配置檔案的大致實現,因為配置檔案很簡單,就是乙個節點下面有多個節點,完全可以這樣實現,根節點基本可以無視,直接就是乙個字典,key存key的值,value存value的值,查詢的時間複雜度就是o(1)。根據屬性查詢--利用佇列按層序查詢
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;
}
簡單測試:
#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中的物件 跳轉到目錄 獲取對應的...