我们用 TinyXML2 库来解析操作xml
下载网址:http://grinninglizard.com/tinyxml2docs/index.html
这个库很简单,首先我们从github上把库下载下来,只要把 tinyxml2.h 和 tinyxml2.cpp 拷贝到工程目录下,添加到工程中就可以了。
下面是读取常用的API,简单介绍一下
tinyxml2::XMLDocument doc;
doc.Parse(char *content, length); //字符串的长度
读取内存中得 xml字符串, 第二个参数为字符串的长度
生成 xml的 node
RootElement(); //获取跟节点
FirstChildElement();//获取第一个值为value的子节点 默认为空则返回第一个节点
NextSiblingElement();//当前对象的下一个节点
FirstAttribute();//获取第一个属性值
Next(); //获取下一个属性值
GetText(); //获取节点的内容
有正序的,自然有反序的,可以直接取 最后一个,上一个
直接贴代码吧,自己感觉写的已经完美了,不想看的同学可以拷贝直接用了,连接的空格和换行 或存储 根据需求改下就行了。
#include <iostream>
#include "tinyxml2.h"
using namespace tinyxml2;
using namespace std;
void read_xml(XMLElement *surface)
{
while (surface)
{
const XMLAttribute *attr = surface->FirstAttribute();//获取第一个属性值
while(attr)
{
cout << " " << attr->Value();
attr = attr->Next(); //获取下一个属性值
}
const char* content = surface->GetText(); //获取节点的内容
if (content)
{
cout << " " << content << endl;
}
XMLElement *surface1 = surface->FirstChildElement(); //查看当前对象是否有子节点
if(surface1)
{
read_xml(surface1);//递归调用
}
surface = surface->NextSiblingElement();//当前对象的下一个节点
}
}
int main()
{
tinyxml2::XMLDocument mydocument; //声明xml对象
mydocument.LoadFile("utf8test.xml"); //载入xml文件
XMLElement *rootElement = mydocument.RootElement(); //获取跟节点
XMLElement *surface = rootElement->FirstChildElement();//获取第一个值为value的子节点 默认为空则返回第一个节点
read_xml(surface);
cin.get();
}
XML原件:
<?xml version="1.0" encoding="UTF-8"?>
<document>
<English name="name1" value="value1">
对方的规范地方<English> The world has many languages</English>
<English> 222</English>
<xxx>xx <xx><x haha="11" hehe="22">doubi</x></xx></xxx>
</English>
<Russian name="name2" value="value2">Мир имеет много языков</Russian>
<Spanish name="el nombre" value="el valor">el mundo tiene muchos idiomas</Spanish>
<SimplifiedChinese name="名字" value="价值">世界有很多语言</SimplifiedChinese>
<Русский название="name" ценность="value"><имеет></Русский>
<汉语 名字="name" 价值="value">世界有很多语言</汉语>
<Heavy>"Mëtæl!"</Heavy>
<ä>Umlaut Element</ä>
</document>
运行结果:(乱码问题是控制台当前编码不是utf8格式编码引起的,不用担心)