网站首页 > java教程 正文
XML文件作为最常使用的存储层次结构数据的文件类型,被广泛应用于三维模型的存储表示。其文件一般是层次化的,用于描述层次化数据,如图1所示。一般地,可以将其结构理解为一颗树,最开始的树根,如图1中的<story>,被称为“根节点”,找到树根之后,继续找到第一个根节点,...,依次能够找到XML文件中所有的数据。
所以,我们要想在程序中读取和处理XML文件,就需要根据XML文件的结构,解析XML文件的所有信息,从而能够处理XML文件中的信息。
由于C语言比较底层,从最基本的文件读写开始写解析XML文件的程序极其困难,并且存在操作不方便,难以扩展和缺乏鲁棒性等问题,所以,在实际开发领域,工程师们一般会找成熟的XML解析库来使用,如本文所要讲的libxml库,使用这些成熟的代码库,能够基本保证程序的稳定性和鲁棒性,并且由于libxml有公开的文档,团队协作就有标准可依。
libxml库需要下载,你可以从官网和github下载,也可以从微云下载,下载地址:https://share.weiyun.com/omPVXlss
下载下来之后,我们需要分别编译三个文件,三个文件分别解压,分别编译。编译之后将生成的lib文件配置到你的工程文件中(这里我们的工程文件使用Visual Studio创建的项目)。
环境配置成功之后,那么如何解析XML文件呢?
解析文档时只需要文档名和一个函数调用,再加上错误处理。下面代码查找keyword节点并打印节点下的文本内容,如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
static int parseXMLDoc(const char* docname) {
xmlDocPtr doc;//XML文件指针
xmlNodePtr cur;//当前节点
xmlNodePtr subcur;//子节点
xmlKeepBlanksDefault(0);
doc = xmlParseFile(docname);
if (doc == NULL) {
fprintf(stderr, "doc error!\n");
return 0;
}
cur = xmlDocGetRootElement(doc);//获取根节点
if (cur == NULL) {
fprintf(stderr, "root error!\n");
xmlFreeDoc(doc);
return 0;
}
//根节点如果不是“xml”,则返回
if (xmlStrcmp(cur->name, (const xmlChar*)"xml")) {
printf("end\n");
return 0;
}
//获取子节点,获取名称为"coefs"的子节点,xml->Geometry->coefs
cur = cur->children;
while (cur != NULL) {
subcur= cur->xmlChildrenNode;
while (subcur != NULL) {
if (strcmp(subcur->name, "coefs") == 0){//查找名称为coefs的子节点
char* str = (char*)xmlNodeGetContent(subcur);
}
subcur = subcur->next;
}
cur = cur->next;
}
xmlFreeDoc(doc);
return 0;
}
int main(int argc, char **argv){
char *docname;
if(argc <= 1){
printf("Usage: %s docname\n", argv[0]);
return 0;
}
docname=argv[1];
parseXMLDoc(docname);
return 1;
}
解析XML文档的基本流程如下:
(1)定义文档指针、节点和子节点指针。子节点是指节点的节点。这里有个父子关系。
(2)调用xmlParseFile()解析文档。如果不成功,返回一个错误提示“"doc error!\n"”并停止。
(3)调用xmlDocGetRootElement()获取文档根节点,若无根节点则输出错误提示“root error!\n”,释放文档,停止。
(4)确认文档是否正确的类型,通过检查根节点名称来判断。
(5)检索节点的内容,这需要遍历文档树。对每个节点,遍历其子节点都需要一个循环。先用cur = cur->xmlChildrenNode获取第一个子节点,然后通过cur = cur->next不断向前遍历,直到cur==NULL。查找找指定节点时使用xmlStrcmp()函数,如果你指定的名称相同,就找到了你要的节点。通常把查找某个子节点的过程封装成函数。
(6)获取节点中的内容。查找到指定节点后,调用xmlNodeListGetString()获取节点下的文本。注意在XML中,包含在节点中的文本是这个节点的子节点,因此获取的是cur->xmlChildrenNode中的字符串。xmlNodeListGetString()会为返回的字符串分配内存,因此记得要用xmlFree()来释放它。
(7)调用xmlFreeDoc()释放文档指针。
猜你喜欢
- 2024-10-17 Qt开发-DOM方式解析XML(qt开发工具)
- 2024-10-17 JAVA 操作笔记-XML(六)(xml在java中怎么用)
- 2024-10-17 作为一名程序猿,你不可不知的Java基础知识的三十个经典问答
- 2024-10-17 Android中XML文件解析,现在了解还不晚
- 2024-10-17 JSP 标准标签库(JSTL)(jsp标签库有哪些)
- 2024-10-17 Spring源码阅读:Spring XML解析机制
- 2024-10-17 XML文件(xml文件怎么打开)
- 2024-10-17 Python如何解析HTML和XML数据(python解析html xml最好的模块)
- 2024-10-17 深入解析Python中的XML处理:理论与实践的结合
- 2024-10-17 XML的解析方式(xml的解析方式有哪些)
你 发表评论:
欢迎- 05-16SpringBoot整合Redis实现常用功能
- 05-16基于Redis实现简单的延时消息队列
- 05-16安装Redis
- 05-16Spring系列之Redis的两种集成方式
- 05-16Django连接Redis集群问题排查思路和总结
- 05-16只需5分钟,完成Redis所有命令操作~
- 05-16熟练使用 Redis 的 5 大数据结构:Java 实战教程
- 05-16Redis 常见业务场景及实例(Java)
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)