一个xml的问题(我发现开始搞的人碰到这个问题的也挺多)

下载libxml2:

官方网站,下载适合自己版本的源码包。

http://rpmfind.net/linux/rpm2html/search.php?query=libxml2-devel

我下载的是:

libxml2-devel-2.9.1-5.1.i586.rpm

用命令解压:

rpm2cpio libxml2-devel-2.9.1-5.1.i586.rpm |cpio –div

这条命令太神了,之后没有用make该有的就都有了。  

liuguili@ubuntu:~/libxml$ rpm2cpiolibxml2-devel-2.9.1-5.1.i586.rpm | cpio -div

liuguili@ubuntu:~/libxml$

liuguili@ubuntu:~/libxml$ cd usr

liuguili@ubuntu:~/libxml/usr$ ls

bin include  lib  share

liuguili@ubuntu:~/libxml/usr$ 

后来胡乱在网上找了一段源码,想编译下试试,结果报头文件找不到。

In file included from test1.c:2:0:

libxml/parser.h:15:31: fatal error:libxml/xmlversion.h: No such file or directory

compilation terminated.

我以为是安装有问题,又装了一遍:

sudo apt-get install libxml2-dev libxslt1-dev

还是不成,毛关系没有。

省略一万字,反正我研究了两个小时~~ 

后来发现加两个编译选项就好了~~ 

liuguili@ubuntu:~/xmltest/usr/include$ g++test1.c -I/home/liuguili/xmltest/usr/include/libxml2/ -L/home/liuguili/xmltest/usr/lib -lxml2 -o testxml

liuguili@ubuntu:~/xmltest/usr/include$ ./testxml

bbbbb

20

谢谢热情的大神~~ 

 

附上在网上找的一段源码

#include <iostream>
#include <libxml/parser.h>
int main(int argc, char *argv[])
{
    xmlDocPtrdoc;           //定义解析文档指针

    xmlNodePtrcurNode;      //定义结点指针(你需要它为了在各个结点间移动)

    xmlChar*szKey;          //临时字符串变量

    char szDocName[] ="d.xml";
    using std::string;
    using std::cout;
    using std::endl;
    
    doc =xmlReadFile(szDocName,"UTF-8",XML_PARSE_RECOVER); //解析文件

    //检查解析文档是否成功,如果不成功,libxml将指一个注册的错误并停止。

    //一个常见错误是不适当的编码。XML标准文档除了用UTF-8UTF-16外还可用其它编码保存。

    //如果文档是这样,libxml将自动地为你转换到UTF-8。更多关于XML编码信息包含在XML标准中.

    if (NULL == doc)
    {
       //文档打开错误

       return -1;
    }
    curNode =xmlDocGetRootElement(doc); //确定文档根元素

    /*检查确认当前文档中包含内容*/

    if (NULL == curNode)
    {
       //空得xml文件

      xmlFreeDoc(doc);
       return -2;
    }
    /*在这个例子中,我们需要确认文档是正确的类型。“root”是在这个示例中使用文档的根类型。*/

    if (xmlStrcmp(curNode->name,BAD_CAST "root"))
    {
       //分析根元素失败

      xmlFreeDoc(doc);
       return -3;
    }
    curNode =curNode->xmlChildrenNode;
    xmlNodePtr propNodePtr =curNode;
    while(curNode != NULL)
    {
       //取出节点中的内容

       if((!xmlStrcmp(curNode->name, (const xmlChar *)"node2")))
       {
          szKey = xmlNodeGetContent(curNode);
          cout << szKey << endl; //得到node2的值并输出

          xmlFree(szKey);
       }
       //查找带有属性attribute的节点

       if(xmlHasProp(curNode,BAD_CAST "b"))
       {
          propNodePtr = curNode;
       }
       curNode =curNode->next;
    }
    //查找属性

    xmlAttrPtr attrPtr =propNodePtr->properties;
    while (attrPtr != NULL)
    {
       if(!xmlStrcmp(attrPtr->name, BAD_CAST "b"))
       {
          xmlChar* szAttr = xmlGetProp(propNodePtr,BAD_CAST "b");
          cout << szAttr << endl; //找到b的属性并输出

          xmlFree(szAttr);
       }
       attrPtr =attrPtr->next;
    }
    xmlFreeDoc(doc);
    return 0;
}

本文要读取的d.xml
<?xml version="1.0"encoding="UTF-8" ?>
<root>
<node1 a="10">aaaaa</node1>
<node2 b="20">bbbbb</node2>

</root> 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值