SlimXml的读和写

学习网址:

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值