精华内容
下载资源
问答
  • libxml2解析xml
    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文档,里面包含iconv-1.9.2.win32、libxml2-2.7.8.win32、zlib-1.2.5三个压缩包,可完整搭建libxml环境,并直接使用libxml下的函数
  • 利用libxml2生成,解析,修改xml文件示例,安装libxml2库, sudo apt-get install libxml2-dev。使用libxml2库进行xml文件的操作,取出了平台差异化,便于在不同的平台都可以进行文件的操作,不受平台系统的限制,...
  • libxml2解析xml总结

    千次阅读 2017-11-10 15:51:57
    libxml2解析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文档内存泄漏我在接收线程中解析从服务器发送过来的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;
    }
    
    

    展开全文
  • 目录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文件,使用MarkUp库读取,简单方便
  • libxml2解析xml文件的要点是需要理解xml文档的树形结构,弄懂三个指针root,children及next,其分别代表父、子及同胞关系。 安装libxml2: 依赖:需要安装python-devel ——yuminstall python-devel  安装libxml...
  • 一、解析XMLxmlDocPtrxmlParseFile...参数:filename,要解析xml文件返回值:如果文件合格,返回指向XML树的指针;否则,返回NULL;xmlDocPtrxmlReadFile(const char * filename, const char *encoding, int option...
  • 通过libxml2的xpath解析xml

    千次阅读 2019-08-12 10:35:12
    XPath 是一门在 XML 文档中查找信息的语言, 基于XML的树状结构,提供在数据结构树中找寻节点的能力,用于在 XML 文档中通过元素和属性进行导航。XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过...
  • 利用libxml2解析xml文档

    2011-07-26 18:44:00
    C程序里可以利用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了:
  • C语言直接处理xml数据是很麻烦的,使用xmllib2.so库函数,能方便的解析、生成xml数据。目录libxml2.so库安装程序效果关键代码参考资料libxml2.so库安装 截图1.CentOS安装libxml2执行命令“yum install libxml2”即可...
  • 以及LIBXML2. XML对我来说完全只是听说过而没有看过...还好看了几天效果还不错. 基本的还是懂.今天分配了一个小任务.解析一个XML配置文件,并建立C结构. XML配置文件如下:  service_1 eth0 192.168.8.201 5 ...
  • libxml2-2.7.4,能够解析并生成xml格式的文件
  • 主要给大家介绍了关于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 &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;...
  • 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 = ...
  • 1、首先下载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...
  • 一、下载 ... 二、编译 在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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,493
精华内容 5,397
关键字:

libxml2解析xml