C++那些事之优雅的解析XML
最近在鹅厂实习中,使用开源的C++ XML解析器-TinyXML-2,今天主要分享该开源项目的基本情况及使用。
1.TinyXML介绍
TinyXML是一个比较优秀的c++ xml解析器,有两个版本,分别是TinyXML与TinyXML-2。最新开源版本TinyXML-2相对于旧版本的 TinyXml 使用更少的内存 , 更快 , 并且使用更少的内存分配 , 因此被广泛应用于现在开发中。
TinyXml2不需要STL ,自然降低了所有的 STL 支持 , 所有字符串操作使用 const char *
。两者相同点:
-
基于DOM解析 -
API简单 -
支持UTF-8
不同点:
(1) TinyXML
-
支持部分STL操作:string、流
(2) TinyXML-2
-
适合现代C++开发 -
内存分配少,需要更少的内存 -
无需STL
TinyXML:
https://sourceforge.net/projects/tinyxml/
TinyXML-2:
https://github.com/leethomason/tinyxml2
2. TinyXML-2使用
使用很简单,下载上述github代码,copy其中的tinyxml2.h与.cpp到你的当前目录下,直接引用.h文件,编译即可。
例如:现有test.xml,parse_test.cpp来解析test.xml中的节点。
test.xml
<category version="1.0">
<book>茅草屋</book>
<number>1</number>
<animal>猫</animal>
</category>
parse_test.cpp
#include "tinyxml2.h"
#include <iostream>
using namespace std;
using namespace tinyxml2;
int main()
{
XMLDocument xml;
xml.LoadFile("test.xml");
XMLElement *category = xml.RootElement();
XMLElement *book = category->FirstChildElement("book");
XMLElement *number = category->FirstChildElement("number");
XMLElement *animal = category->FirstChildElement("animal");
const char* book_name = book->GetText();
cout << book_name << endl;
int num = atoi(number->GetText());
cout << num << endl;
const char* animal_name = animal->GetText();
cout << animal_name << endl;
return 0;
}
编译:
g++ -o parse parse_test.cpp tinyxml2.cpp
输出:
茅草屋
1
猫
当然还有其他的用法,例如:CRUD操作等,自己可以探索一番。