学习网址:
SlimXml和TinyXml,RapidXml的性能对比
https://www.cnblogs.com/westfly/articles/2079978.html
看这篇文章
TinyXML2 入门教程
https://blog.csdn.net/K346K346/article/details/48750417
SlimXml: 不依赖顺序,注释会失败
Markup:依赖顺序,可以解析带注释 xml
TinyXml: 都支持,如果对效率不高要求,建议用TinyXml
SlimXml是一个小巧,快速,易用的c++ XML解析器。
特性:
1.支持多种编码的XML文 件:multi-byte, utf-8, utf-8 no mark, utf-16, utf-16 big endian
2.仅依赖c++标准库,便于移植注:
<1>xml里有注释loadFromMemory会失败
<2>xml里有中文loadFromMemory也会失败
<algn>东门100米</algn>//加载会失败
读和写的例子实现:
#include <signal.h>
#include <string>
#include <sstream>
#include <iostream>
#include <memory>
#include "SlimXml.h"
using namespace slim;
//using namespace std;
/*
<?xml version='1.0' encoding='UTF-8'?>
<result>
<camera>
<cameraid>0111420004</cameraid>
</camera>
</result>
*/
int test_readCameraXML( )
{
XmlNode *n;
XmlNode *node_result;
XmlNode *node_camera;
NodeIterator iter;
NodeIterator iter_camera;
/*
std:string strXml=" \
<?xml version='1.0' encoding='UTF-8'?> \
<result> \
<camera> \
<cameraid>0111420004</cameraid> \
</camera> \
</result>";
*/
// <!--中文注释 -->
std::string strXml="\
<?xml version='1.0' encoding='UTF-8'?> \
<param>\
<camera>\
<serverip>您好</serverip> \
<company>0</company> \
<type>0</type>\
<ip>10.121.149.155</ip> \
<port>80</port>\
<user>admin</user>\
<pwd>3edc3edc</pwd>\
<id>0101</id>\
<channel>0</channel>\
<streamType>1</streamType>\
<algn_stake_number>12</algn_stake_number>\
<sipservercode></sipservercode>\
<sipserverip></sipserverip>\
<sipserverport></sipserverport>\
<sipprotocoltype></sipprotocoltype>\
<channelid></channelid>\
<pollingtype>0</pollingtype>\
<iscontrol>2</iscontrol>\
<captureandcontrol>1</captureandcontrol>\
<protocoltype>0</protocoltype>\
<name></name>\
<location>base64</location>\
</camera> \
</param> ";
//XmlDocument *pDoc = new XmlDocument();
std::shared_ptr<XmlDocument> pDoc(new XmlDocument());
//std::shared_ptr<XmlDocument> pDoc = std::make_shared<XmlDocument>();
//读内存里的xml
if (!(pDoc->loadFromMemory(strXml.c_str(), strXml.size())))
{
//delete pDoc;
return -1;
}
// 第一级XML节点,对应result
node_result = pDoc->getFirstChild(iter);
while (node_result != nullptr)
{
node_camera = node_result->findChild("camera"); //找camera
//node_camera = node_result->getFirstChild(iter_camera); //也能找到camera
if(nullptr != node_camera)
{
n = node_camera->findChild("cameraid");
if(nullptr != n) //getType,对第1级、第2级、最后一级元素都是1,没有意义
{
std::cout<<"str,cameraid="<<n->getString()<<std::endl;
std::cout<<"int,cameraid="<<n->getInt()<<std::endl;
}
n = node_camera->findChild("ip");
//if(ELEMENT == n->getType()) //getType,对第1级、第2级、最后一级元素都是1,没有意义
if(nullptr != n)
{
std::cout<<"str,ip="<<n->getString()<<std::endl;
std::cout<<"int,ip="<<n->getInt()<<std::endl;
}
}
node_result = pDoc->getNextChild(iter);
}
//delete pDoc;
return 0;
}
int test_readFileXML( )
{
XmlNode *n;
XmlNode *node_result;
XmlNode *node_camera;
NodeIterator iter;
NodeIterator iter_camera;
//第1步: 创建XmlDocument
//指针*和shared_ptr创建
//XmlDocument *pDoc = new XmlDocument();//1.指针*方式 需要配合(delete pDoc)
std::shared_ptr<XmlDocument> pDoc(new XmlDocument());//指针share_ptr方式
//std::shared_ptr<XmlDocument> pDoc = std::make_shared<XmlDocument>();//make_share创建
//第2步:加载文件
//const char* filename = "camera.xml";//debug模式下loadFromFile失败
//if (!(pDoc->loadFromFile(filename)))
std::string filename = "/home/tf/work/project/mediaserver/test/test/slimxml/bin/camera.xml";
if (!(pDoc->loadFromFile(filename.c_str())))
{
//delete pDoc;
return -1;
}
//第3步:进行解析
// 第一级XML节点,对应result
node_result = pDoc->getFirstChild(iter);
while (node_result != nullptr)
{
node_camera = node_result->findChild("camera"); //找camera
//node_camera = node_result->getFirstChild(iter_camera); //也能找到camera
if(nullptr != node_camera)
{
n = node_camera->findChild("cameraid");
if(nullptr != n) //getType,对第1级、第2级、最后一级元素都是1,没有意义
{
std::cout<<"str,cameraid="<<n->getString()<<std::endl;
std::cout<<"int,cameraid="<<n->getInt()<<std::endl;
}
n = node_camera->findChild("ip");
//if(ELEMENT == n->getType()) //getType,对第1级、第2级、最后一级元素都是1,没有意义
if(nullptr != n)
{
std::cout<<"str,ip="<<n->getString()<<std::endl;
std::cout<<"int,ip="<<n->getInt()<<std::endl;
}
}
node_result = pDoc->getNextChild(iter);
}
//delete pDoc;
return 0;
}
int test_writeCameraXML( )
{
char xmlbuff[2048];
int xmlbuffsize = 2048;
char *pStr;
int xmlHeadLen, xmlLen = 0;
XmlDocument *pOutDoc;
XmlNode *node_parent;
XmlNode *node_camera;
XmlNode *node_base;
pStr = xmlbuff;
strncpy(pStr, T("<?xml version='1.0' encoding='UTF-8'?>\r\n"), xmlbuffsize);
xmlHeadLen = strlen(pStr);
xmlbuffsize -= xmlHeadLen;
pStr += xmlHeadLen;
pOutDoc = new XmlDocument();
node_parent = pOutDoc->addChild("result");//对应第一级xml
node_camera = node_parent->addChild("camera");
node_base = node_camera->addChild("cameraid");
node_base->setString("123456789");
pOutDoc->save("write.xml");
std::string output;
pOutDoc->getDocument(output);
//cout<<output<<endl;
strncpy(pStr, output.c_str(), xmlbuffsize);
xmlLen += output.size();
std::cout<<xmlbuff<<std::endl;
delete pOutDoc;
return 0;
}
int main()
{
//test_readCameraXML();
test_readFileXML( );
//test_writeCameraXML( );
return 0;
}