libxml2解析xml文档,c语言实现,并给出案例

test.xml文档内容如下:

<root><name>Debug.group</name><website>https://debug.group</website><function><json>https://debug.group/json.html</json><sql>https://debug.group/sql.html</sql></function>
</root>

实现步骤如下:

  1. 确保test.xml文件存在于程序可访问的路径中,并且具有以下内容:
  2. 使用libxml2的API读取和解析XML文件。

  3. 遍历解析后的DOM树,提取所需的信息。

  4. 清理分配的内存和结束libxml2的解析环境。

实现代码如下:

#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>int main() {// 确保libxml2版本正确LIBXML_TEST_VERSION// 读取XML文件xmlDocPtr doc = xmlReadFile("test.xml", NULL, 0);if (doc == NULL) {fprintf(stderr, "无法读取XML文件 test.xml\n");return 1;}// 获取XML文档的根元素xmlNodePtr root = xmlDocGetRootElement(doc);if (root == NULL) {fprintf(stderr, "文档为空\n");xmlFreeDoc(doc);return 1;}// 检查根元素的名字是否为 'root'if (xmlStrcmp(root->name, (const xmlChar *) "root")) {fprintf(stderr, "文档类型错误,根节点名称不是 'root'\n");xmlFreeDoc(doc);return 1;}// 遍历根元素的子节点xmlNodePtr cur = root->xmlChildrenNode;while (cur != NULL) {if (xmlStrEqual(cur->name, (const xmlChar *)"name")) {// 获取 'name' 元素的内容xmlChar *name_content = xmlNodeGetContent(cur);printf("Name: %s\n", name_content);xmlFree(name_content);} else if (xmlStrEqual(cur->name, (const xmlChar *)"website")) {// 获取 'website' 元素的内容xmlChar *website_content = xmlNodeGetContent(cur);printf("Website: %s\n", website_content);xmlFree(website_content);}// 寻找 'function' 元素,并遍历它的子元素if (xmlStrEqual(cur->name, (const xmlChar *)"function")) {xmlNodePtr func_cur = cur->xmlChildrenNode;while (func_cur != NULL) {if (xmlStrEqual(func_cur->name, (const xmlChar *)"json")) {// 获取 'json' 元素的内容xmlChar *json_content = xmlNodeGetContent(func_cur);printf("JSON Endpoint: %s\n", json_content);xmlFree(json_content);} else if (xmlStrEqual(func_cur->name, (const xmlChar *)"sql")) {// 获取 'sql' 元素的内容xmlChar *sql_content = xmlNodeGetContent(func_cur);printf("SQL Endpoint: %s\n", sql_content);xmlFree(sql_content);}func_cur = func_cur->next;}}cur = cur->next;}// 清理并释放文档xmlFreeDoc(doc);// 清理并结束libxml2的解析环境xmlCleanupParser();return 0;
}

编译使用gcc:

gcc -o test readXml.c -I/usr/include/libxml2 -lxml2

【attention】红色部分替换成你虚拟机下libxml2安装的路径,使用pkg-config --cflags libxml-2.0查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/11994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot MockMvc

SpringBoot MockMvc 1 什么是 MockMvc&#xff1f;2 为什么使用 MockMvc&#xff1f;3 如何使用 MockMvc&#xff1f;3.1 Controller3.2 测试方法一3.3 测试方法二 1 什么是 MockMvc&#xff1f; Spring Boot 提供了一个方便的测试工具类 MockMvc&#xff0c;用于对 Controlle…

【JavaScript超详细的学习笔记-下】JavaScrip超详细的学习笔记,共27部分,12多万字,学习js不错的选择,内容超详细

想要获取笔记的可以点击下面链接获取&#xff0c;或者私信我 ** JavaScript超详细的学习笔记&#xff0c;点击我获取 13&#xff0c;闭包 13-1 闭包 闭包是指有权访问另一个函数作用域中的变量的函数&#xff1b;其本质就是在一个函数内部创建另一个内部函数&#xff1b;并…

基于若依的开源网盘系统

简介 在线网盘系统&#xff0c;使用了DFA算法&#xff0c;实现了文件夹的创建与修改&#xff0c;多级目录&#xff0c;很正常的文件夹一样&#xff0c;支持所有文件上传&#xff0c;并按文件类型分类&#xff0c;支持文件删除&#xff0c;回收站管理&#xff0c;恢复与彻底删除…

数据特征降维 | 局部线性嵌入(LLE)

局部线性嵌入(Locally Linear Embedding,LLE)是一种非线性降维和数据嵌入技术,用于将高维数据映射到低维空间中,以便更好地展示数据的结构和关系。 LLE的基本思想是假设数据样本在局部区域内可以近似由其相邻样本的线性组合表示。通过保持这种局部线性关系,LLE能够在低维…

掌握QPainter:Qt中的绘图艺术

目录标题 1. QPainter概述2. 创建QPainter对象3. 绘制基本图形4. 绘制文本5. 绘制图像6. 使用画笔&#xff08;QPen&#xff09;7. 使用画刷&#xff08;QBrush&#xff09;8. 图形变换9. 抗锯齿与优化10. 实例代码与解析11. 总结 在Qt的世界里&#xff0c;QPainter是一位多才多…

设计模式-11 - Adapter Pattern 适配器设计模式

设计模式-11 - Adapter Pattern 适配器设计模式 1.定义 适配器模式是一种结构型设计模式&#xff0c;它允许具有不同接口的两个类一起工作。它通过创建一个适配器类来实现这一点&#xff0c;该适配器类将一个类的接口转换为另一个类所需的接口。 2.内涵 适配器设计模式的内涵…

低空经济:无人机竞赛详解

无人机竞赛市场近年来呈现出蓬勃发展的态势&#xff0c;其市场价值不仅体现在竞赛本身&#xff0c;还体现在推动无人机技术创新、拓展应用场景以及促进产业链发展等多个方面。 一、比赛项目介绍 无人机竞赛通常分为多个项目&#xff0c;包括竞速赛、技巧赛、航拍赛等。每个项目…

Ubuntu下C++编程总结AllInOne

之前主要是在win下用VisualStudio&#xff0c;现在研究总结在ubuntu下使用CMake编程经验&#xff0c;填坑记录 目录 0. 前述1.Ubuntu下多线程使用 0. 前述 1.Ubuntu下多线程使用 出现的问题&#xff1a;undefined reference to symbol pthread_create 使用多线程&#xff0c…

HR人才测评:自控能力与岗位胜任力素质测评

自控能力是什么&#xff1f; 自控能力可以解释为自我控制的能力&#xff0c;指一个人在应对人事物突发事件时&#xff0c;及时调整进行的自我控制的表现&#xff0c;它是实行自我支配的一种能力&#xff0c;在能进行自主支配时&#xff0c;一个人就成熟不少了&#xff0c;也可以…

js的跳转传参方式

在JavaScript中&#xff0c;实现页面跳转并传递参数的方式有多种&#xff0c;以下是一些常见的方法&#xff1a; URL参数 你可以通过修改URL的查询字符串&#xff08;query string&#xff09;来传递参数。这些参数会在URL的?之后&#xff0c;并使用&进行分隔。 代码 /…

优选算法——双指针1

双指针 常⻅的双指针有两种形式&#xff0c;⼀种是对撞指针&#xff0c;⼀种是左右指针。 对撞指针&#xff1a;⼀般⽤于顺序结构中&#xff0c;也称左右指针。 对撞指针从两端向中间移动。⼀个指针从最左端开始&#xff0c;另⼀个从最右端开始&#xff0c;然后逐渐往中间逼 近…

std::mem_fn和std::mem_fun

std::mem_fn和std::mem_fun&#xff08;deprecated&#xff09; Convert member function to function object&#xff0c;即将成员函数转化为函数对象&#xff0c;这样就可以像普通函数那样使用。 示例一&#xff1a; #include <iostream> // std::cout #include …

MySQL-InnoDB数据存储结构

1、存储结构-页 索引结构提供了高效的索引方式&#xff0c;索引信息以及数据记录都保存在数据文件或索引文件中&#xff08;本质存储在页结构中&#xff09; 1.1、磁盘与内存交互的基本单位&#xff1a;页 在InnoDB中将数据划分为若干页&#xff0c;页的默认大小为&#xff…

webpack并行构建示例:

由于js的单线程特性&#xff0c;文件和任务时 要等待一个任务执行完成后执行下一个任务&#xff0c;但在实际开发中&#xff0c;很多任务是可以并行执行的&#xff08;如同时处理多个不同js文件或同事压缩多张图片&#xff09;&#xff0c;一些loader和插件&#xff08;thread-…

【数据结构】解密链表之旅(单链表篇)

前言 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我想让大家知道…

自制无感无刷电机驱动板

自制无感无刷电机驱动板 分别测试了基于C251的STC32G单片机、Arduino AVR的ATmega328PB、以及ARM的ST32F103单片机。 &#x1f9f2;测试转动效果 ✒目前市面上开源的有关无刷电机的项目数不胜数&#xff0c;其控制原理都大同小异&#xff0c;在没有领透其技术要领情况下&#x…

苍穹外卖项目---------收获以及改进(9-12)

①Spring Task-------实现系统定时任务 概念&#xff1a; 应用场景&#xff1a; 使用步骤&#xff1a; 实现订单超时和前一天派送中的订单的自动任务处理&#xff1a; Component Slf4j public class Mytask {Autowiredprivate OrderServiceimpl orderServiceimpl;/*** 处理订…

yarn 安装以及报错处理

前一种报错是由于没有安装yarn导致的&#xff0c;使用以下命令即可安装&#xff1a; npm install -g yarn 如果成功安装&#xff0c;将显示Yarn的版本号。 yarn --version 第二种报错是因为系统上的执行策略限制导致的。执行策略是一种安全功能&#xff0c;用于控制在计算机…

grafana10.x报错 Failed to upgrade legacy queries Datasource x was not found

问题 grafana 从6.x升级到10.x后&#xff0c;导入json文件后报错&#xff0c;数据源x查询不到&#xff0c;grafana不显示数据&#xff1b; Templating Failed to upgrade legacy queries Datasource x was not found解决方法 可能grafana升级后数据源找不到&#xff0c;在面板…

上海市计算机学会竞赛平台2023年10月月赛丙组三个数的中位数

题目描述 给定三个整数&#xff0c;请输出按大小排序后&#xff0c;位于正中间的数字。 输入格式 第一行&#xff1a;三个整数 &#x1d44e;a, &#x1d44f;b 与 &#x1d450;c 输出格式 第一行&#xff1a;单个整数表示三者的中位数 数据范围 −10000≤&#x1d44e…