Linux下的xml文件的解析

解析一个xml文档,从中取出想要的信息,例如节点中包含的文字,或者某个节点的属性,其流程如下:

l     用xmlReadFile函数读出一个文档指针doc;

l     用xmlDocGetRootElement函数得到根节点curNode;

l     curNode->xmlChildrenNode就是根节点的子节点集合;

l     轮询子节点集合,找到所需的节点,用xmlNodeGetContent取出其内容;

l     用xmlHasProp查找含有某个属性的节点;

l     取出该节点的属性集合,用xmlGetProp取出其属性值;

l     用xmlFreeDoc函数关闭文档指针,并清除本文档中所有节点动态申请的内存。

注意:节点列表的指针依然是xmlNodePtr,属性列表的指针也是xmlAttrPtr,并没有xmlNodeList或者xmlAttrList这样的类型。看作列表的时候使用它们的next和prev链表指针来进行轮询。只有在Xpath中有xmlNodeSet这种类型,其使用方法前面已经介绍了。

程序实例1:

#include </usr/include/libxml2/libxml/parser.h>
#include </usr/include/libxml2/libxml/tree.h>

int main(int argc , char **argv)
{
         //定义文档指针以便后面获取文档指针
    xmlDocPtr     pdoc = NULL;

         //定义一个根结点
    xmlNodePtr    proot=NULL , pcurnode = NULL;

         //要解析的文件
    char *psfilename=(const char*)"input.xml";

         //获取要读的文件数并传指针
    pdoc = xmlReadFile(psfilename ,"UTF-8",XML_PARSE_RECOVER);

          //判断指针是否获取成功,失败的情况
    if(NULL == pdoc)
         {
         printf("error: open file %s" , psfilename);
         exit(1);
           }

           //获取根结点给pcurnode
       pcurnode = xmlDocGetRootElement(pdoc);
          //判断根结点是否获取成功
    if(NULL == pcurnode)
        {
         printf("error: empty document %s" , psfilename);
         exit(1);
           }

             //判断此结点是不是想要的结点(通过名字比较),相同为0,不同为1
       if(xmlStrcmp(pcurnode->name , BAD_CAST "plist") != 0)
            {
        printf("error document " );
        exit(1);
           }
            //如果该结点拥有此属性,进行输出属性值
    if(xmlHasProp(pcurnode ,BAD_CAST "version"))
         {
                  //先获取相应属性值
         xmlChar *szAttr = xmlGetProp(pcurnode, BAD_CAST "version");
                 //输出此属性值
         printf("version : %s \n" , szAttr);

       }

    //释放文档指针
    xmlFreeDoc(pdoc);

    xmlCleanupParser();

return(0);
}

涉及函数:

xmlParseFile,xmlReadFile,xmlDocGetRootElement,xmlHasProp,xmlGetProp。其中xmlParseFile和xmlReadFile都具备打开XML文件的功能,xmlParseFile函数以默认方式读入一个UTF-8格式的文档,并返回文档指针。xmlReadFile函数读入一个带有某种编码的xml文档,并返回文档指针。

解析字符串xml的话就需要:

string s;

pdoc = xmlRecoverDoc(BAD_CAST s.c_str());

但是要求字符串没有回车每个结点之间不能有空格

例如: <><><><><>紧凑排列
展开阅读全文

没有更多推荐了,返回首页