C语言 获取xml节点名及对应的节点值
来源:互联网 发布:淘宝寄错地址了怎么办 编辑:程序博客网 时间:2024/06/03 11:15
<span style="font-size:24px;"> 很久没有碰xml这种东西了,今天有一朋友问如何解析一个xml文档,并获取每个节点对应的节点值,于是在网上找了一番,虽然有很多方法可以实现,但总觉得不如我所愿,于是自己用C语言写个简单的程序来实现此功能,仅供参考。</span>在ubuntu15.04系统下进行测试的,首先得安装libxml2库 apt-get install libxml2;安装完成后,就开始写代码getXml.c,包含两个函数,其完成功能是:传给它一个xml文档,函数进行解析,提取每个节点的节点名和相对应的节点值分别保存在nodeName和nodeValue这两个指针数组里,从而可以获得所需的节点名和对应的节点值。其代码如下:
#include <stdio.h>#include <libxml/parser.h>#include <libxml/tree.h>#include <libxml/xpath.h>#include <string.h>#define MAXSIZE 1024int count;char *nodeName[MAXSIZE]; /* save xmlNode name */char *nodeValue[MAXSIZE]; /* save xmlNode value */
/* get xml node name and value */
int getNameValue(xmlNodePtr rootNode, char *saveName[], char *saveValue[]){ xmlNodePtr curNode = NULL; xmlChar *szkey = NULL; if(rootNode == NULL) { return -1; } curNode = rootNode; curNode = curNode->xmlChildrenNode; while(curNode != NULL) { /* ignore xmlNode name is "text" node */
if(strcmp(curNode->name, "text") != 0) { saveName[count] = (char *)curNode->name; if(curNode->xmlChildrenNode->next == NULL) { szkey = xmlNodeGetContent(curNode); saveValue[count] = (char *)szkey; } else saveValue[count] = ""; count ++; } if(curNode->xmlChildrenNode != NULL) { getNameValue(curNode, saveName, saveValue); } curNode = curNode->next; } return 0;}
/* parsing xml file */
int readfile(char *file){ xmlDocPtr doc = NULL; xmlNodePtr rootNode = NULL; count = 0; doc = xmlReadFile(file,"UTF-8", XML_PARSE_RECOVER); if(doc == NULL) { perror("xmlReadFile() error !\n"); return -1; } //doc = xmlParseMemory(buff, strlen(buf)+1);//xml字符串解析 rootNode = xmlDocGetRootElement(doc);//xml文件解析 if(NULL == rootNode) { printf("doc is empty\n"); xmlFreeDoc(doc); return -1; } getNameValue(rootNode, nodeName, nodeValue); return 0;}
下面是main 函数:
<pre name="code" class="objc">int main(int argc, char *argv[]){ int ret; int i; int j; if(argv[1] == NULL) { printf("eg: ./xxx.exe [xxx.xml] \n"); return 0; } ret = readfile(argv[1]); if(ret == -1) { printf("error !\n"); return 0; }printf("%d\n", count); printf("***********************************************************\n"); for(i = 0; i < count ; i++) { printf("%s: %s\n",nodeName[i], nodeValue[i]); } return 0;}
代码写好之后就是编译,如下:
gcc -o test getXml.c -lxml2 -I/usr/include/libxml2
编写一个标准的xml文档Network.xml内容如下:
<?xml version="1.0" encoding="utf-8"?><NetworkInterfaceList version="1.0"> <NetworkInterface version="1.0"> <id>0</id> <IPAddress> <ipVersion>v4</ipVersion> <addressingType>static</addressingType> <ipAddress>192.168.1.124</ipAddress> <subnetMask>255.255.255.0</subnetMask> <ipv6Address>xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx</ipv6Address> <bitMast>2</bitMast> <DefaultGateway> <ipAddress>192.168.1.0</ipAddress> <ipv6Address>xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx</ipv6Address> </DefaultGateway> <PrimaryDNS> <ipAddress>192.168.1.22</ipAddress> <ipv6Address>xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx</ipv6Address> </PrimaryDNS> <SecondaryDNS> <ipAddress>192.168.1.11</ipAddress> <ipv6Address>xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx</ipv6Address> </SecondaryDNS> </IPAddress> </NetworkInterface> </NetworkInterfaceList>
0 1
- C语言 获取xml节点名及对应的节点值
- 获取xml节点的值
- Xml获取子节点的节点的值
- 使用DOM解析XML的文件属性名和属性值、节点名和节点值
- 使用DOM生成XML的文件属性名和属性值、节点名和节点值
- Java使用DOM解析XML的文件属性名和属性值、节点名和节点值
- 获取XML文件某一个节点的值
- 获取xml中指定节点的值
- 解析xml获取节点的值
- Xml中获取子节点的值
- RAC 中 ASM 实例名 与 节点的对应关系
- RAC 中 ASM 实例名 与 节点的对应关系
- RAC 中 ASM 实例名 与 节点的对应关系
- 【C语言】查找链表的中间节点及倒数第K个节点
- xml获取节点方法
- asp 获取xml节点
- JavaScript DOM中获取元素节点的父节点和父节点名
- TinyXML 根据属性名,属性值返回对应的元素节点(源代码)
- UVA10020 Minimal coverage 贪心
- redis的初始化
- LeetCode_101Symmetric Tree
- poj1523
- shell操作mysql
- C语言 获取xml节点名及对应的节点值
- yeoman
- [小技巧] git 通过 comment 关键字查找 commit
- Git 上传到BAE报错
- OpenGL蓝宝书第七章:立体天空和纹理折射、双纹理(下)
- 在Activity的onCreate方法中获取控件宽高的N种方法
- 监控文件夹
- iOS开发之上传图片
- Android之Audio常用属性变量