C tinyXML2封裝,解析XML檔案

2021-10-03 16:17:58 字數 4578 閱讀 3783

要實現對xml檔案的解析,首先需要使用github上面的開源元件tinyxml2,將tinyxml2中的tinyxml2.cpptinyxml2.h同時複製到專案下面即可。

tinyxml2 github鏈結

1.tinyxml元件使用

整個的使用方法與log4cpp的使用方法比較相似,通過程式建立好的xml檔案如下:

data.xml:

<

?xml version=

"1.0" encoding=

"utf-8"

?>

"swjtu"

>

"worthy"

>

23<

/age>

99.5

<

/grade>

<

/student>

"john"

>

25<

/age>

100<

/grade>

<

/student>

<

/school>

終端的輸出如下:

wwx@linux:~/week3/par***ml$ g++ main.cpp tinyxml2.cpp -o main

wwx@linux:~/week3/par***ml$ ./main

school schoolname=swjtu

student studentname=worthy

age:23

grade:99.5

student studentname=john

age:25

grade:100

接下來就是完整的程式,可以仔細研究:

#include

"tinyxml2.h"

#include

using

namespace tinyxml2;

using

namespace std;

bool

createxml

(const

char

* path)

delete doc;

return

true;}

bool

readxml

(const

char

* path)

//get root element

xmlelement *root = doc.

rootelement()

; cout << root-

>

name()

<<

" schoolname="

<< root-

>

attribute

("schoolname"

)<< endl;

//tree structure , from first layer to second layer

xmlelement *first = root-

>

firstchildelement()

;while

(first)

first = first-

>

nextsiblingelement()

;}return

true;}

intmain()

2.xml檔案進行dfs(深度優先遍歷)遍歷所有節點

xml檔案的內部組成和樹的結構相似,從根節點開始不斷往下延申,要想遍歷xml檔案中的所有資訊,就需要用到遍歷樹節點的dfs方法。

#include

"tinyxml2.h"

#include

#include

using

namespace tinyxml2;

using

namespace std;

void

show_all_node

(xmlelement *tmpnode,

int presize)

cout <<

">"

<< endl;

/******************獲取節點資訊text*********************/

if(tmpnode-

>

gettext()

)//一定要判斷不然會有問題,如果文字為空的話,會列印text=後直接結束程序

cout<<

setw

(presize+3)

<< tmpnode-

>

gettext()

<<

" "

(tmpnode-

>

firstchildelement()

, presize+2)

;//遞迴掉用,列印子節點所有屬性和文字資訊

/******************節點閉合資訊以及轉移節點*********************/

cout<<

setw

(presize)

<<

"<>

name()

<<

">"

<< endl;

//獲取同級別的下乙個兄弟元素

tmpnode=tmpnode-

>

nextsiblingelement()

;}}bool

readxml

(const

char

* path)

//get root element

xmlelement *root = doc.

rootelement()

;//tree structure , from first layer to second layer

show_all_node

(root,0)

;return

true;}

intmain()

rssreader.hpp:

#ifndef _rssreader_h_

#define _rssreader_h_

#include

"tinyxml2.h"

#include

#include

#include

#include

#include

#include

#include

using std::cout;

using std::endl;

using std::ofstream;

using std::regex;

using std::regex_replace;

using std::string;

using std::stringstream;

using std::vector;

using

namespace tinyxml2;

struct rssitem

;class

rssreader

;void rssreader::

dfs(xmlelement *root)

if(link-

>

gettext()

)if(description-

>

gettext()

)if(content-

>

gettext()

) _rss.

push_back

(it);}

dfs(root-

>

firstchildelement()

);root = root-

>

nextsiblingelement()

;}}bool rssreader::

parserss

(const

char

*filename)

//get root element

xmlelement *root = doc.

rootelement()

;dfs

(root)

;return

true;}

void rssreader::

dump

(const string &filename)

for(

int i =

0; i < _rss.

size()

; i++

) ofs.

close()

;}#endif

main.cpp:

#include

"rssreader.h"

intmain()

物件導向2 封裝,this,構造方法

封裝 把成員變數 方法私有化,在基本類裡面提供他們公共的訪問方法 private關鍵字的作用 公共的訪問方法 set和 get方法 快捷鍵 alt shift s r 乙個手機類 成員變數 brand,price,color 將成員變數私有化,提供公共的訪問方式 手機類 class phone pu...

06 封裝struts2引數

action動作類 public class personaction extends actionsupport public string getname public void setname string name struts.xml 張岩 success.jsp 系統執行期間使用者提交表...

struts2封裝請求引數的幾種方式

方式一 動作類action本身作為model物件,set 方法封裝搞定 乙個name params 的 幹的 頁面表單 動作類封裝資料 定義欄位名 set 方法 字段屬性和表單的name屬性名保持一致 public class textaction extends actionsupport 注 模...