libxml2
来源:互联网 发布:阿里云独立控制面板 编辑:程序博客网 时间:2024/05/16 18:36
libxml2尝试
etc项目中实现一个http server,刚好用到大量的XML,每次处理的数据包XML数据相对较小,先尝试了expat,SAX解析方式确实痛苦,需要自己维护状态树。 libxml2相对功能比较全,SAX、DOM解析方式都有实现,而且还有XPath、XLink等实现,甚至连HTMLparser都有了,下面是我这次用到的一些API:
1、解析XML文档DOM树(参考parser.h)
xmlDocPtr doc = xmlParseDoc((const xmlChar *)xml_data);
xmlNodePtr node = xmlDocGetRootElement(doc);
然后node就可以在DOM树里面漫游了,当然xmlParseDoc之后理所当然应该检查doc是否为空意即解析是否成功,结束之后记得 xmlFreeDoc(doc);如果需要解析xml文件,则使用xmlParseFile(const xmlChar *)"test.xml")。
2、常见操作(参考tree.h)
得到一个节点的名称:node->name^_^
得到一个节点的内容:xmlChar *value = xmlNodeGetContent(node)返回值value应该使用xmlFree(value)释放内存
设置一个节点的内容:xmlNodeSetContent(node, (const xmlChar *)"test")
得到一个节点的某属性值:xmlChar *value = xmlGetProp(node, (const xmlChar *)"prop1"),返回值需要xmlFree(value)释放内存
设置一个节点的某属性值:xmlSetProp(node, (const xmlChar *)"prop1", (const xmlChar *)"v1")
3、新建XML文档(参考tree.h)
xmlDocPtr doc = xmlNewDoc("1.0"),其中1.0是版本号
doc->children = xmlNewDocNode(doc, NULL, (const xmlChar *)"stream", NULL)创建根节点,具体函数原型可参考其API-Manual
xmlNodePtr node = xmlNewChild(doc->children, NULL, (const xmlChar *)"dsrc_frame", NULL),用xmlNewChild可生成某节点的子节点
xmlDocDumpFormatMemory(doc, buf, &result, 1),用来保存生成的xml文档到内存中,此系列函数还包括:xmlDocDump、xmlDocDumpFormatMemoryEnc、 xmlDocDumpMemory、xmlDocDumpMemoryEnc、xmlDocFormatDump
4、XPath操作(参考xpath.h)(XPath可参考w3c文档http://www.w3.org/TR/xpath)
有时候对一个XML文档我们可能只关心其中某一个或某几个特定的Element的值或其属性,如果漫游DOM树将是很痛苦也很无聊的事,XPath可以非常方便地得到你想的Element。下面是一个自定义函数:
下面是调用代码:
1、解析XML文档DOM树(参考parser.h)
xmlDocPtr doc = xmlParseDoc((const xmlChar *)xml_data);
xmlNodePtr node = xmlDocGetRootElement(doc);
然后node就可以在DOM树里面漫游了,当然xmlParseDoc之后理所当然应该检查doc是否为空意即解析是否成功,结束之后记得 xmlFreeDoc(doc);如果需要解析xml文件,则使用xmlParseFile(const xmlChar *)"test.xml")。
2、常见操作(参考tree.h)
得到一个节点的名称:node->name^_^
得到一个节点的内容:xmlChar *value = xmlNodeGetContent(node)返回值value应该使用xmlFree(value)释放内存
设置一个节点的内容:xmlNodeSetContent(node, (const xmlChar *)"test")
得到一个节点的某属性值:xmlChar *value = xmlGetProp(node, (const xmlChar *)"prop1"),返回值需要xmlFree(value)释放内存
设置一个节点的某属性值:xmlSetProp(node, (const xmlChar *)"prop1", (const xmlChar *)"v1")
3、新建XML文档(参考tree.h)
xmlDocPtr doc = xmlNewDoc("1.0"),其中1.0是版本号
doc->children = xmlNewDocNode(doc, NULL, (const xmlChar *)"stream", NULL)创建根节点,具体函数原型可参考其API-Manual
xmlNodePtr node = xmlNewChild(doc->children, NULL, (const xmlChar *)"dsrc_frame", NULL),用xmlNewChild可生成某节点的子节点
xmlDocDumpFormatMemory(doc, buf, &result, 1),用来保存生成的xml文档到内存中,此系列函数还包括:xmlDocDump、xmlDocDumpFormatMemoryEnc、 xmlDocDumpMemory、xmlDocDumpMemoryEnc、xmlDocFormatDump
4、XPath操作(参考xpath.h)(XPath可参考w3c文档http://www.w3.org/TR/xpath)
有时候对一个XML文档我们可能只关心其中某一个或某几个特定的Element的值或其属性,如果漫游DOM树将是很痛苦也很无聊的事,XPath可以非常方便地得到你想的Element。下面是一个自定义函数:
xmlXPathObjectPtrget_nodeset(xmlDocPtr doc, const xmlChar *xpath){ xmlXPathContextPtr context; xmlXPathObjectPtr result; context = xmlXPathNewContext(doc); if (context == NULL) return NULL; result = xmlXPathEvalExpression(xpath, context); xmlXPathFreeContext(context); if (result == NULL) return NULL; if (xmlXPathNodeSetIsEmpty(result->nodesetval)) { xmlXPathFreeObject(result); return NULL; } return result;}
下面是调用代码:
xmlXPathObjectPtr app_result = get_nodeset(doc, (const xmlChar *)"/stream/dsrc_frame/tapdu/application[1]/param");if (app_result == NULL) return 0;xmlNodeSetPtr nodeset = app_result->nodesetval;xmlChar *value = xmlNodeGetContent(nodeset->nodeTab[0]);if (value == NULL) goto ret;printf("%s\n", value);xmlXPathFreeObject(app_result);xmlFree(value);
- libxml2
- libxml2
- libxml2
- libxml2
- libxml2
- libxml2
- libxml2
- Libxml2
- libxml2
- libxml2
- using libxml2
- Using Libxml2
- Libxml2使用指南
- Libxml2使用指南
- libxml2使用
- libxml2 安装
- libxml2笔记
- libxml2使用说明
- 新内容--jQuery
- 异步回调(Asychronous Callback)
- NSUserDefaults 用来存储用户设置信息
- 有关windows下使用emacs
- 采用busybox的嵌入式Linux根文件系统的的制作方法
- libxml2
- Java String,StringBuilder,StringBuffer
- Android:电话接听
- static的两种用途
- HashMap和HashTable的区别
- jQuery1.7系列四: 事件
- jquery实现放大镜
- 计划协议--scheduling agreement
- Android MediaPlayer状态机