要實現對xml檔案的解析,首先需要使用github上面的開源元件tinyxml2,將tinyxml2中的tinyxml2.cpp
與tinyxml2.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 注 模...