-
2016-02-16 12:03:05
1. 编译xml解析c代码
gcc xml_ParseStory.c -I/usr/include/libxml2/ -lxml2
2. 安装libxml2报错
libxml2安装中出现的错误:
cannot remove`libtoolT': No such file or directory
解决方法:
修改configure文件
$ vim configure
删除这一行: $RM"$cfgfile"
重新再运行 $ ./configure
更多相关内容 -
libxml2解析xml工具 软件包
2020-02-12 10:34:17libxml2工具包,用于操作xml文档,里面包含iconv-1.9.2.win32、libxml2-2.7.8.win32、zlib-1.2.5三个压缩包,可完整搭建libxml环境,并直接使用libxml下的函数 -
libxml2生成,解析,修改xml文件
2018-06-27 10:05:25利用libxml2生成,解析,修改xml文件示例,安装libxml2库, sudo apt-get install libxml2-dev。使用libxml2库进行xml文件的操作,取出了平台差异化,便于在不同的平台都可以进行文件的操作,不受平台系统的限制,... -
libxml2解析xml总结
2017-11-10 15:51:57libxml2解析xml总结 开发平台:linux IDE:eclipse 语言:c 使用libxml2对xml进行解析有两种方法,一种是纯使用libxml2提供的接口,另一种是使用xpath。只使用libxml2的接口需要进行多层的循环嵌套,...libxml2解析xml总结
- 开发平台:linux
- IDE:eclipse
- 语言:c
使用libxml2对xml进行解析有两种方法,一种是纯使用libxml2提供的接口,另一种是使用xpath。只使用libxml2的接口需要进行多层的循环嵌套,比较麻烦,相对来说xpath封装的更好,使用起来更方便。下面具体来描述libxml2的函数以及使用xpath的方法。
代码块
下面是一个使用xpath的例子,其中tim_subtract.h是一个计算时间差的函数,方便统计程序的执行时间:
#include <stdio.h> #include <stdlib.h> #include <parser.h> #include <tree.h> #include <xpath.h> #include <xpathInternals.h> #include <xmlmemory.h> #include <xpointer.h> #include "tim_subtract.h" //使用xpath来获得目标结点 xmlXPathObjectPtr getNodeset(xmlDocPtr pdoc, const xmlChar *xpath) { xmlXPathContextPtr context = NULL; //定义XPath上下文指针 context = xmlXPathNewContext(pdoc);//用xml文档指针来初始化context指针 xmlXPathObjectPtr result = NULL; //定义XPath结果指针 if (pdoc == NULL) { printf("pdoc is NULL\n"); return NULL; } if (xpath) { if (context == NULL) { printf("context is NULL\n"); return NULL; } result = xmlXPathEvalExpression(xpath, context);//计算xpath的查询结果,并存入result中 if (result == NULL) { printf("xmlXPathEvalExpression return NULL\n"); return NULL; } if (xmlXPathNodeSetIsEmpty(result->nodesetval)) //使用result->nodesetval得到节点集合指针,其中包含了所有符合Xpath查询结果的节点 { xmlXPathFreeObject(result);//使用释放Xpath对象指针; printf("nodeset is empty\n"); return NULL; } } return result; } int main(int argc, char **argv) { struct timeval t1,t2,diff; gettimeofday(&t1,0); xmlDocPtr pdoc = NULL;//文档指针 xmlNodePtr proot = NULL;//节点指针 /*****************打开xml文档********************/ //参数为文件名、编码类型和枚举变量(下面一个或多个的组合) //XML_PARSE_RECOVER = 1<<0, recover on errors 尝试修复错误语法 //XML_PARSE_NOERROR = 1<<5, suppress error reports 不输出错误日志 //XML_PARSE_NOWARNING = 1<<6, suppress warning reports 不输出警告日志 //XML_PARSE_PEDANTIC = 1<<7, pedantic error reporting */ 输出详细的错误日志 //XML_PARSE_NOERROR和XML_PARSE_NOWARNING的功能是“当运行命令行程序时不输出错误/警告日志”。 pdoc = xmlReadFile("NewFile.xml", "UTF-8", XML_PARSE_RECOVER); if (pdoc == NULL) { printf("error:can't open file!\n"); exit(1); } /*****************获取xml文档对象的根节对象********************/ proot = xmlDocGetRootElement(pdoc); if (proot == NULL) { printf("error: file is empty!\n"); exit(1); } /*****************查找书店中所有书籍的名称********************/ xmlChar *xpath = BAD_CAST ("/producttype/product/*"); //xpath语句,路径为product的所有子元素 xmlXPathObjectPtr result = getNodeset(pdoc, xpath); //调用函数,查询XPath表达式,得到一个查询结果 if (result == NULL) { printf("result is NULL\n"); exit(1); } if (result) { xmlNodeSetPtr nodeset = result->nodesetval; //获取查询到的节点指针集合,其中包含了所有符合Xpath查询结果的节点; xmlNodePtr cur;//声明一个临时的当前结点指针 //nodeset->nodeNr是集合元素总数,for遍历每个符合结果的结点 int i; for (i = 0; i < nodeset->nodeNr; i++) { cur = nodeset->nodeTab[i];//遍历 /**************接下来就是使用libxml2函数进行结点的操作**********/ while (cur != NULL) { //查找名为write的结点,并输出其内容 if (!xmlStrcmp(cur->name, BAD_CAST ("write")))//xmlStrcmp为对比,相同时返回值为0 { printf("write: %s\n", ((char*) xmlNodeGetContent(cur)));//xmlNodeGetContent为获得某结点的内容 break; } //创建结点,结点名称为CHILD xmlNodePtr child=xmlNewNode(NULL,BAD_CAST"CHILD"); //设置其内容和属性 xmlNodeSetContent(child,BAD_CAST"子节点"); xmlSetProp(child,BAD_CAST"属性名",BAD_CAST"属性内容"); //移除属性,返回0成功,-1失败,每次只能移除一个属性 int i; i=xmlRemoveProp(cur); //将child添加给cur为子结点 xmlAddChidl(cur,child); //创建并直接添加子节点 xmlNewTextChild(cur, NULL, BAD_CAST "结点名称", BAD_CAST "结点内容"); //删除newNode1 if (!xmlStrcmp(cur->name, BAD_CAST "newGrandSon")) { xmlNodePtr tempNode; tempNode = cur->next; //使用一个临时变量来存储断链节点的后续节点 xmlUnlinkNode(cur); //将当前节点从文档中断链(unlink),这样本文档就不会再包含这个子节点 xmlFreeNode(cur); //手动删除断链节点的内存 cur = tempNode; continue; } cur = cur->next; } } xmlXPathFreeObject(result); //释放结果指针 } gettimeofday(&t2,0); int ret=tim_subtract(&diff,&t1,&t2); if(ret>-1) { printf("%d\t%d",diff.tv_sec,diff.tv_usec); } //存储xml文档 int nRel = xmlSaveFile("NewFile.xml", pdoc); /*****************释放资源********************/ xmlFreeDoc(pdoc); xmlCleanupParser(); xmlMemoryDump(); return 0; }
<!--xml文件--> <?xml version="1.0" encoding="UTF-8"?> <producttype> <product category="PHP"> <id>1001</id> <no>NOC0001</no> <name>PHP高级设计教程</name> <price>88.99</price> <writer> <name>zhang</name> <sex>男</sex> </writer> <time>2015.12.30</time> </product> <product category="JAVA"> <id>1002</id> <no>NOC0002</no> <name>Thinking inJava</name> <price>102.99</price> <writer> <name>zhang</name> <sex>男</sex> </writer> <time>2004.03.30</time> </product> <product category="WEB"> <id>1003</id> <no>NOC0003</no> <name>WEB高级开发教程</name> <price>78.99</price> <writer> <name>zhang</name> <sex>男</sex> </writer> <time>2012.07.30</time> </product> </producttype>
具体某些函数的用法可以参考该网站
Module tree from libxml2 http://xmlsoft.org/html/libxml-tree.html附上求时间差的函数
#include <stdio.h> #include <stdlib.h> #include <time.h> #include "tim_subtract.h" int tim_subtract(struct timeval *result, struct timeval *x, struct timeval *y) { //int nsec; if (x->tv_sec > y->tv_sec) return -1; if ((x->tv_sec == y->tv_sec) && (x->tv_usec > y->tv_usec)) return -1; result->tv_sec = (y->tv_sec - x->tv_sec); result->tv_usec = (y->tv_usec - x->tv_usec); if (result->tv_usec < 0) { result->tv_sec--; result->tv_usec += 1000000; } return 0;
其中tv_sec单位是秒,tv_usec单位是微秒
-
libxml2 解析xml文档内存泄漏,该如何解决
2021-05-17 15:58:58libxml2 解析xml文档内存泄漏我在接收线程中解析从服务器发送过来的xml数据流,解析程序如下:intxml_parse(char*buf,intsize,intindex){inti,len,id;xmlDocPtrdoc;xmlNodePtrcurNode;doc=xmlParseMemory(buf,size);...libxml2 解析xml文档内存泄漏
我在接收线程中解析从服务器发送过来的xml数据流,解析程序如下:
int xml_parse(char *buf,int size, int index)
{
int i,len,id;
xmlDocPtr doc;
xmlNodePtr curNode;
doc = xmlParseMemory(buf,size);
if (doc == NULL)
{
fprintf(stderr,"Document not parsed successfully.\n");
return -1;
}
curNode = xmlDocGetRootElement(doc); // get root element
if (NULL == curNode)
{
fprintf(stderr,"empty document.\n");
xmlFreeDoc(doc);
return -1;
}
if (xmlStrcmp(curNode->name, BAD_CAST "root"))
{
fprintf(stderr,"document of the wrong type, root node != root");
xmlFreeDoc(doc);
return -1;
}
curNode = curNode->xmlChildrenNode; // get first child
while(curNode != NULL)
{
if(!xmlStrcmp(curNode->name, BAD_CAST "heart_beat"))
{
//heart beat handle
curNode = curNode->children;
while(curNode != NULL)
{
if(0 == xmlStrcmp(curNode->name,(const xmlChar *) "time"))
{
char *content = (char *)xmlNodeListGetString(doc,curNode->xmlChildrenNode,1);
if(content)
{
printf("recv notify...\n");
xmlFree(content);
}
break;
}
curNode = curNode->next;
-
如何使用libxml2解析xml
2017-05-27 14:02:29通过简单的例子,告诉大家如何使用libxml2库来解析xml格式的配置文件,本文中将使用如下xml: 192.168.10.238 7777 192.168.10.238 media_server_888 media_server 8888 8889 8888 如何...通过简单的例子,告诉大家如何使用libxml2库来解析xml格式的配置文件,本文中将使用如下xml: <?xml version="1.0" encoding="UTF-8"?> <Params> <ServerInfo> <ServerIP>192.168.10.238</ServerIP> <ServerPort>7777</ServerPort> </ServerInfo> <MediaServerInfo> <ServerIP>192.168.10.238</ServerIP> <Name>media_server_888</Name> <Type>media_server</Type> <VideoTCPPort>8888</VideoTCPPort> <AudioTCPPort>8889</AudioTCPPort> <GlobalID>8888</GlobalID> </MediaServerInfo> </Params> 如何解析出xml文件中各个参数的值?具体代码如下: struct ServerInfo{ char BusinessServerIP[16]; unsigned int BusinessPort; char MediaServerIP[16]; char MediaServerName[64]; char MediaServerType[64]; unsigned int VideoTCPPort; unsigned int AudioTCPPort; unsigned int GlobalID; } static bool ParseConfigInfo(ServerInfo *si) { xmlDocPtr pdoc; xmlNodePtr proot; //忽略xml配置文件中的空行 xmlKeepBlanksDefault(0); //加载xml文件 pdoc = xmlParseFile(CONFIG_NAME); if(!pdoc) return false; proot = xmlDocGetRootElement(pdoc); if(!proot) return false; xmlNodePtr pcur = proot->xmlChildrenNode; while( pcur != NULL ) { //cout << pcur->name <<endl; if(!xmlStrcmp(pcur->name, (const xmlChar *)"ServerInfo")) { //cout << "Got Server node" <<endl; xmlNodePtr child = pcur->children; while( child != NULL ) { if(!xmlStrcmp(child->name,(const xmlChar *)"ServerIP")) { strcpy(si->BusinessServerIP, (char*)xmlNodeGetContent(child)); } if(!xmlStrcmp(child->name,(xmlChar *)"ServerPort")) { si->BusinessPort = atoi((const char *)xmlNodeGetContent(child)); } child = child->next; } } else if(!xmlStrcmp(pcur->name, (const xmlChar *)"MediaServerInfo")) { xmlNodePtr child = pcur->children; while( child != NULL ) { if(!xmlStrcmp(child->name,(const xmlChar *)"ServerIP")) { strcpy(si->MediaServerIP, (char*)xmlNodeGetContent(child)); } if(!xmlStrcmp(child->name,(xmlChar *)"Name")) { strcpy(si->MediaServerName, (char *)xmlNodeGetContent(child)); } if(!xmlStrcmp(child->name,(xmlChar *)"Type")) { strcpy(si->MediaServerType, (char *)xmlNodeGetContent(child)); } if(!xmlStrcmp(child->name,(xmlChar *)"VideoTCPPort")) { si->VideoTCPPort = atoi((const char *)xmlNodeGetContent(child)); } if(!xmlStrcmp(child->name,(xmlChar *)"AudioTCPPort")) { si->AudioTCPPort = atoi((const char *)xmlNodeGetContent(child)); } if(!xmlStrcmp(child->name,(xmlChar *)"GlobalID")) { si->GlobalID = atoi((const char *)xmlNodeGetContent(child)); } child = child->next; } } pcur = pcur->next; } xmlFreeDoc(pdoc); xmlCleanupParser(); xmlMemoryDump(); return true; } static void ShowConfigInfo(ServerInfo *si) { cout << "BusinessServerIP:" << si->BusinessServerIP <<endl; cout << "BusinessPort:" << si->BusinessPort<<endl; cout << "MediaServerIP:" << si->MediaServerIP<<endl; cout << "MediaServerName:" << si->MediaServerName<<endl; cout << "MediaServerType:" << si->MediaServerType<<endl; cout << "VideoTCPPort:" << si->VideoTCPPort<<endl; cout << "AudioTCPPort:" << si->AudioTCPPort<<endl; cout << "GlobalID:" << si->GlobalID<<endl; }
-
Linux下使用libxml库解析xml文件
2021-05-14 21:00:09目录libxml简介libxml库安装libxml2中的数据类型和函数xml文档解析实例运行结果libxml简介libxml是一个用于解析xml文件的库,在各个平台下都能使用,也支持多种语言,如c,Python等。libxml库安装直接使用shell命令... -
libxml2解析XML
2013-11-12 16:09:19最近需要在Linux下解析Xml,原来用的msxml排不上用场了,就自己封装了一下libxml2,当然易用性比不上msxml,凑活能用,呵呵,嗯,记录一下吧,先看.h文件 #ifndef __DOXML_H__ #define __DOXML_H__ #include #... -
[Linux C]利用libxml2解析xml文件
2012-03-09 15:42:17为了解析xml,可以使用Linux下默认安装的libxml2。 /* a.c 功能:利用libxml2解析xml文件 */ #include #include #include #include #include #include #include #include int GetCurFilePath(char *... -
c++中使用libxml2读取xml文件
2012-04-10 11:25:37c++中使用libxml2读取xml文件,使用MarkUp库读取,简单方便 -
xml文件解析(二)——运用libxml2库解析xml文件
2016-02-28 20:30:41libxml2解析xml文件的要点是需要理解xml文档的树形结构,弄懂三个指针root,children及next,其分别代表父、子及同胞关系。 安装libxml2: 依赖:需要安装python-devel ——yuminstall python-devel 安装libxml... -
使用C语言解析xml之libxml2
2021-05-21 12:20:20一、解析XMLxmlDocPtrxmlParseFile...参数:filename,要解析的xml文件返回值:如果文件合格,返回指向XML树的指针;否则,返回NULL;xmlDocPtrxmlReadFile(const char * filename, const char *encoding, int option... -
通过libxml2的xpath解析xml
2019-08-12 10:35:12XPath 是一门在 XML 文档中查找信息的语言, 基于XML的树状结构,提供在数据结构树中找寻节点的能力,用于在 XML 文档中通过元素和属性进行导航。XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过... -
利用libxml2解析xml文档
2011-07-26 18:44:00C程序里可以利用libxml2库去解析xml文档。利用libxml2可以很轻松的解析,生成xml文件。 比较好的教程如下:http://www.blogjava.net/wxb_nudt/archive/2007/11/18/161340.html 这里演示一个小例子,包含了遍历节点... -
libxml2 解析xml字符串
2017-01-11 20:07:35最近在封装一个sdk接口给内部使用的时候,原来项目都是用c++开发的,xml解析工具用的是:Tinyxml,挺不错...网上想找现成的,结果发现都是解析文件的,记录一下解析xml字符串的过程吧,主要是内存的管理小心一点就OK了: -
使用libxml2库处理xml数据
2021-05-22 09:26:27C语言直接处理xml数据是很麻烦的,使用xmllib2.so库函数,能方便的解析、生成xml数据。目录libxml2.so库安装程序效果关键代码参考资料libxml2.so库安装 截图1.CentOS安装libxml2执行命令“yum install libxml2”即可... -
用C语言解析XML配置文件,使用libxml2动态连接库
2019-05-06 19:30:12以及LIBXML2. XML对我来说完全只是听说过而没有看过...还好看了几天效果还不错. 基本的还是懂.今天分配了一个小任务.解析一个XML配置文件,并建立C结构. XML配置文件如下: service_1 eth0 192.168.8.201 5 ... -
libxml2-解析xml格式文件
2010-01-08 15:41:36libxml2-2.7.4,能够解析并生成xml格式的文件 -
C/C++利用libxml2高效输出XML大文件详解
2020-08-28 19:05:16主要给大家介绍了关于C/C++利用libxml2高效输出XML大文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。 -
Linux C]利用libxml2解析xml文件
2018-03-06 19:42:29为了解析xml,可以使用Linux下默认安装的libxml2。[cpp] view plaincopy/* a.c 功能:利用libxml2解析xml文件 */ #include <stdio.h> #include <stdlib.h> #include <... -
libxml2解析xml文件记录
2012-05-23 16:36:11由于之前没怎么使用过xml,今天发现一个问题,直接使用子节点无法获取节点的属性,通过打印发现节点name为text,但是xml中不存在,通过上网查找由于xml对数据默认为text节点,虽然xml文档中看不到,但是在解析是存在... -
Linux下使用libxml2解析XML配置文件
2015-08-20 09:34:28这是一个项目过程中所遇到的问题。有多个商品种类,每个商品种类有着不同的基本信息,现在我们需要对这些基本信息进行验证。但是每个种类会有自己独特的验证需求(不同种类需要验证的...与上一篇文章使用tinyxml解析XML -
采用libxml2解析xml资源
2016-08-01 10:29:09通过分析xml资源,发现它不是一个标准的xml资源,通过调用xml解析 xmlXPathObjectPtr getNodeset(xmlDocPtr doc, const xmlChar *xpath) { xmlXPathContextPtr context; xmlXPathObjectPtr result; context = ... -
libxml2源码下载、编译,以及解析xml文件(C++版本)
2020-10-22 15:21:011、首先下载libxml2源码并编译 #git clone https://gitlab.gnome.org/GNOME/libxml2.git #cd libxml2 #mkdir build #cd build #cmake .. #make #make install 2、例程如下 代码,test.cpp /* * date : 2020... -
libxml2快速解析xml配置文件
2020-05-23 17:16:30一、下载 ... 二、编译 在arm平台下运行。 cd libxml2-2.9.1 ..../configure CROSS_COMPILE=arm-hisiv400-linux- --host=arm-hisiv400-linux --prefix=/opt/libxml2 --enable-shared --with-python=no make make insta