• pugixml XML格式处理库的介绍和使用(面向业务编程-格式处理)


    pugixml XML格式处理库的介绍和使用(面向业务编程-格式处理)

    介绍

    pugixml是一个轻量级的C++ XML处理库。它的特点:

    • 类似dom的界面,具有丰富的遍历/修改功能

    • 非常快速的非验证XML解析器

    • 它从XML文件/缓冲区构造DOM树用于复杂数据驱动

    • 支持树查询的XPath 1.0

    • 实现Unicode接口变体和自动编码转换的完整Unicode支持

    开源仓库地址:https://github.com/zeux/pugixml

    XML格式介绍

    有很多配置文件的格式也是XML格式的,而且有些GUI也可以依据XML规则去执行一些渲染。

    • 结构化强,适合UI表达:类似HTML、XAML也是基于XML的。总之XML是一种结构化很强的语言。
    • 程序处理解析简单:因为有较强的结构化,所以基本上程序解析起来比较简单,不容易出错。
    • 基本单元是标签:有一般标签和自闭合标签,并且可以给标签加各种属性。

    注释:XML支持注释,学过HTML的就知道,注释格式如下

    
    

    结束

    使用方式

    引入头文件

    pugixml的使用很简单,只需要引入头文件,然后就可以开始用了

    #include "pugixml.hpp"
    using namespace pugi;
    

    从XML文件中读取数据

    准备XML文件(input.xml)内容如下

    <platform>
        <ip>192.168.1.2ip>
        <port>50000port>
        <key>keyvaluekey>
    platform>
    

    读取XML文件解析数据

    (main.cpp) 如下

    int parseXMLfromFile() {
        pugi::xml_document doc;
        pugi::xml_parse_result result = doc.load_file("input.xml");
        if(!result)
            return -1;
        cout << "parse result: " << endl;
        xml_node root_node = doc.child("platform");
        xml_node ip_node = root_node.child("ip");
        xml_node port_node = root_node.child("port");
        xml_node key_node = root_node.child("key");
        cout << ip_node.text().as_string() << endl;
        cout << port_node.text().as_int() << endl;
        cout << key_node.text().as_string() << endl;
        return 0;
    }
    

    我们可以用迭代器访问列表,如下

        for (auto node : doc.child("Document").children("Data")) {
        	#if STRING_TYPE
            string item = node.text().as_string();
            cout << item << endl;
            #else
            int out = node.text().as_int();
            cout << out << endl;
            #endif
        }
    

    XPath树访问

    pugixml支持XPath 1.0,通过XPath可以快速对节点操作

    XPath 是一门在 XML 文档中查找信息的语言,内容较为复杂,这里不展开讲了。有兴趣自行学习

    int parseXMLUseXpathfromFile() {
        // 正常读取解析,和上面一样
        pugi::xml_document doc;
        pugi::xml_parse_result result = doc.load_file("input.xml");
        if(!result)
            return -1;
        //使用XPath访问
        pugi::xpath_node key_node = doc.select_node("/platform/key");
        cout << key_node.node().text().as_string() << endl;
        return 0;
    }
    

    将数据录入xml文件

    int saveXMLtoFile() {
        pugi::xml_document doc;
        pugi::xml_node node_dec = doc.prepend_child(pugi::node_declaration);
        node_dec.append_attribute("version") = "1.0";
        node_dec.append_attribute("encoding") = "utf-8";
        pugi::xml_node node_comm = doc.append_child(pugi::node_comment);
        node_comm.set_value("this is a comment");
        pugi::xml_node root_node = doc.append_child("root");
        pugi::xml_node sub_node = root_node.append_child("key");
        // 添加一个属性
        sub_node.append_attribute("attribute").set_value("attributeValue");
        // 设置空标签内部值
        sub_node.append_child(pugi::node_pcdata).set_value("keyValue");
        doc.save_file("./output.xml");
        return 0;
    }
    

    以库的形式添加到项目中

    以第三方库的形式添加到项目中

    本文为作者原创文章,转载请注明出处:https://www.cnblogs.com/nbtech/p/use_pugixml_library.html

    首先我们下载pugixml源代码

    mkdir UsePugixmlProject && cd UsePugixmlProject
    git clone https://github.com/zeux/pugixml.git
    vim CMakeLists.txt
    

    CMakeLists.txt内容如下

    # 下面3行是我们正常一个文件的CMake写法
    cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
    project(pugixml-test LANGUAGES CXX)
    add_executable(xml_test main.cpp)
    # 添加pugixml库,1、包含头文件目录;2、添加库的源文件,声明这个库;3、将这个库链接到上面的目标文件中
    include_directories(pugixml/src)
    add_library(pugixml
        STATIC
        pugixml/src/pugixml.cpp
    )
    target_link_libraries(xml_test pugixml)
    

    main.cpp文件就是我们上面小节的示例代码

    // https://www.cnblogs.com/nbtech/p/use_pugixml_library.html
    int main() {
        return parseXMLfromFile();
    }
    

    写完之后创建目录并编译

    mkdir build && cd build
    cmake .. && make
    

    在我们项目中,用CMake添加pugixml库操作如上

    如果想改成共享库,只需要把CMakeLists.txt的STATIC改成SHARED即可

    交叉编译?

    有时候我们希望它可以跨平台,那么只需要在cmake配置的时候指定交叉编译工具即可

    cmake -D CMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ ..
    

    __EOF__

  • 本文作者: Kevin
  • 本文链接: https://www.cnblogs.com/nbtech/p/use_pugixml_library.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    DAMA-CDGA/CDGP数据治理认证包括哪几个方面?
    pandas第8章-文本数据
    Taro+react问题集合
    MPDIoU: A Loss for Efficient and Accurate Bounding BoxRegression
    使用Kibana进行数据可视化
    企业该如何做好日志管理?
    【JavaWeb笔记】Servlet入门—获取参数
    Java并发编程实战之互斥锁
    Java.lang.Byte类之parseByte()方法的简介说明
    SpringBoot Security 单点登出清除所有业务系统的 token
  • 原文地址:https://www.cnblogs.com/nbtech/p/use_pugixml_library.html