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

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

时间:2023-03-10 14:56:47浏览次数:60  
标签:XML node xml doc pugixml pugi 格式

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++ ..

标签:XML,node,xml,doc,pugixml,pugi,格式
From: https://www.cnblogs.com/nbtech/p/use_pugixml_library.html

相关文章

  • springboot 全局 Date参数接收 String格式 转换异常报错
    JSONparseerror:Cannotdeserializevalueoftype`java.util.Date`fromString\"2023-03-1010:00:00\":notavalidrepresentation(error:FailedtoparseDa......
  • java自定义注解实现字段格式化(二)
    上篇java自定义注解实现字段格式化 我们自定义了另一个浮点数格式化的注解一、格式化处理器接口但在实际生产中,处理浮点数的格式化,可能还会有其他数据的格式化,比如日期......
  • xml使用foreach
     publicclassOrderScenicBindParamimplementsSerializable{privateLongorgId;privateList<Long>parkList;publicLonggetOrgId(){......
  • 格式化字符串
    sprintf用于组包,将零散的数据,按照固定的格式,组成字符串。一般用来发送信息头文件:#include<stdio.h>intsprintf(char*str,constchar*format,......)......
  • SQL Server 自定义DateTime格式化显示内容
    SQLServer的Convert函数没有想要的格式类型,需要自定义显示格式。CASTandCONVERT(Transact-SQL)Thesefunctionsconvertanexpressionofonedatatypetoanothe......
  • simpleini库的介绍和使用(面向业务编程-格式处理)
    simpleini库的介绍和使用(面向业务编程-格式处理)介绍simpleini是一个跨平台的ini格式处理库,提供了一些简单的API来读取和写入ini风格的配置文件。它支持ASCII、MBCS和Unic......
  • [前端]使用xml文件实现网页多语言化
    方法1HTML代码:<html><head><scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script><script>$(document).ready(function(){......
  • JS系列---【转化时间格式moment】
    1.先安装momentnpminstallmoment--save2.在main.js进入并加到原型上供全局使用importmomentfrom'moment';//moment.locale('zh-cn');//根据情况需要Vue.prot......
  • AntDesignVue的时间选择器a-date-picker范围格式化时间
    业务效果图核心代码<template><a-date-pickerv-model='record.payTime'show-timeautoclearplaceholder='请选择付款时间'valueFormat='YYYY-MM-DDHH:mm:ss'......
  • 直播网站源码,vue工具类,时间格式化
    直播网站源码,vue工具类,时间格式化最近做uniapp经常用到时间格式化,需要转为刚刚、几分钟前等字符串格式,自己根据需求整理了一个工具类 效果说明:时间转字符串格式,时间戳......