1

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

 1 year ago
source link: https://www.cnblogs.com/nbtech/p/use_pugixml_library.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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.2</ip>
    <port>50000</port>
    <key>keyvalue</key>
</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__


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK