免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8792 | 回复: 6
上一主题 下一主题

[C] [已解决]libxml2遍历取所有节点名称的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-08 09:58 |只看该作者 |倒序浏览
test.xml

  1. <?xml version="1.0"?>
  2. <story>
  3.   <storyinfo>
  4.     <author>John Fleck</author>
  5.     <datewritten>June 2, 2002</datewritten>
  6.     <keyword>example keyword</keyword>
  7.   </storyinfo>
  8.   <body>
  9.     <headline>This is the headline</headline>
  10.     <para>This is the body text.</para>
  11.   </body>
  12. </story>
复制代码


获取所有节点名称的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

xmlNodePtr currentNode;

xmlNodePtr parseDoc(char *docname) {

    xmlDocPtr doc;
    xmlNodePtr cur;
    
    xmlKeepBlanksDefault(0);
    doc = xmlParseFile(docname);
    
    if (doc == NULL ) {
        fprintf(stderr,"Document not parsed successfully. \n");
        return;
    }
    
    cur = xmlDocGetRootElement(doc);
    
    if (cur == NULL) {
        fprintf(stderr,"empty document\n");
        xmlFreeDoc(doc);
        return;
    }
    
    return cur;
}

void printChildrenNames(xmlNodePtr cur) {
    if (cur != NULL) {
        cur = cur->xmlChildrenNode;
        
        while (cur != NULL){
            printf("Current Node: %s\n", cur->name);
            printChildrenNames(cur);
            cur = cur->next;
        }
        
        return;
    }else{
        fprintf(stderr, "ERROR: Null Node!");
        return;
    }
}

int main(int argc, char **argv) {

    char *docname;
        
    if (argc <= 1) {
        printf("Usage: %s docname\n", argv[0]);
        return(0);
    }

    docname = argv[1];
    currentNode = parseDoc (docname);
    //printf("Root Node: %s\n", currentNode->name);

    printChildrenNames(currentNode);
    return (1);
}


可是奇怪的是程序运行的结果是:
Current Node: storyinfo
Current Node: author
Current Node: text
Current Node: datewritten
Current Node: text
Current Node: keyword
Current Node: text
Current Node: body
Current Node: headline
Current Node: text
Current Node: para
Current Node: text
为啥会有这么多的text是哪来的?

[ 本帖最后由 brumby007 于 2008-12-8 11:19 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-12-08 10:14 |只看该作者
去理解DOM,每一个文本都是text节点

论坛徽章:
0
3 [报告]
发表于 2008-12-08 10:16 |只看该作者
lz如果不理解,可以在嵌套的时候,打印一下嵌套的层次

论坛徽章:
0
4 [报告]
发表于 2008-12-08 10:54 |只看该作者
那是不是说打出这个text的段是遍历到节点的值的时候打出来的?
比如:
<para>This is the body text.</para>
程序会遍历到This is the body text
此时打印text

如果是这样的话,那我想要实现取得一个xml中的所有节点的名称该咋办(不用xpath的情况下)?

论坛徽章:
0
5 [报告]
发表于 2008-12-08 11:07 |只看该作者
哦,我找到方法了
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

xmlNodePtr currentNode;
xmlDocPtr doc;
xmlNodePtr parseDoc(char *docname) {

&nbsp;&nbsp;&nbsp;&nbsp;//xmlDocPtr doc;

&nbsp;&nbsp;&nbsp;&nbsp;xmlNodePtr cur;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;xmlKeepBlanksDefault(0);
&nbsp;&nbsp;&nbsp;&nbsp;doc = xmlParseFile(docname);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if (doc == NULL ) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,"Document not parsed successfully. \n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;cur = xmlDocGetRootElement(doc);

&nbsp;&nbsp;&nbsp;&nbsp;if (cur == NULL) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,"empty document\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlFreeDoc(doc);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;return cur;
}

void printChildrenNames(xmlNodePtr cur) {
&nbsp;&nbsp;&nbsp;&nbsp;if (cur != NULL) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur = cur->xmlChildrenNode;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (cur != NULL){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(cur->type == XML_ELEMENT_NODE){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Current Node: %s\n", cur->name);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printChildrenNames(cur);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur = cur->next;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr, "ERROR: Null Node!");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;}
}

int main(int argc, char **argv) {

&nbsp;&nbsp;&nbsp;&nbsp;char *docname;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if (argc <= 1) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Usage: %s docname\n", argv[0]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;docname = argv[1];
&nbsp;&nbsp;&nbsp;&nbsp;currentNode = parseDoc (docname);
&nbsp;&nbsp;&nbsp;&nbsp;//printf("Root Node: %s\n", currentNode->name);

&nbsp;&nbsp;&nbsp;&nbsp;printChildrenNames(currentNode);
&nbsp;&nbsp;&nbsp;&nbsp;return (1);
}

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-07-18 06:20:00
6 [报告]
发表于 2009-07-15 19:49 |只看该作者
好像还是不行呀,按照你的方法

论坛徽章:
0
7
发表于 2012-01-10 16:26
加上这句:xmlKeepBlanksDefault(0); 去掉空格。回复 1# brumby007


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP