libxml2的简单使用

白昼怎懂夜的黑 提交于 2020-04-15 16:08:13

【推荐阅读】微服务还能火多久?>>>

libxml2是处理xml的C库。网上很多加载,解析xml的参考,但是却没有这样的参考:从解析,修改某个node,再保存的完整过程。

代码

#include <stdio.h>
#include <stdlib.h>

#include <libxml/parser.h>
#include <libxml/xpath.h>

void parse(char *file) {
    xmlChar *text;
    xmlDocPtr doc;
    xmlXPathContextPtr ctxt;
    xmlXPathObjectPtr obj;
    xmlNodePtr cur;
    char name[256];
    int size;
	
    xmlChar *new_xml = NULL;

    doc = xmlParseFile(file);

    if (doc == NULL ) {
        fprintf(stderr,"failed to parse file \"%s\".\n", file);
        return;
	}
	
	    ctxt = xmlXPathNewContext(doc);
    if (ctxt == NULL) {
        fprintf(stderr,"failed to alloc ctxt\n");
        return;
    }

    obj = xmlXPathEval(BAD_CAST "/network/name", ctxt);
    cur = obj->nodesetval->nodeTab[0]->children;
    if (!cur || cur->type != XML_TEXT_NODE || cur->next != NULL) {
        fprintf(stderr,"failed to search name \n");
        return;
    }
	   text = xmlNodeGetContent(cur);
    printf("orig name: %s\n", text);
	
    sprintf(name, "%s-v2", text);
    xmlNodeSetContent(cur, (const xmlChar *)name);
    xmlDocDumpMemory(doc, &new_xml, &size);
    printf("new xml size: %d\n", size);
    printf("new xml: %s\n", new_xml);
	
	xmlFreeNode(cur);
	xmlXPathFreeObject(obj);
	xmlXPathFreeContext(ctxt);
    xmlFreeDoc(doc);
    return;
}

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

    if (argc < 2) {
        fprintf(stderr, "Usage: %s filename\n", argv[0]);
        return -1;
    }

    parse(argv[1]);

    return 0;
}

编译

gcc -Wall -g -I /usr/include/libxml2 -lxml2 parse.c -o parse

示例

xml file

<network>
  <name>test</name>
</network>

parse ./test.xml

参考

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!