使用libxml2创建和解析xml文件
毕业设计需要用到xml文件来组织和存放数据,
对于Linux环境下,有libxml2可供使用。
经过一段时间查询文档和网站,
基本掌握创建xml文档和解析xml的操作,
简单做一下记录。
创建xml
例子如下:
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h> int main(int argc, char **argv)
{
xmlDocPtr doc = NULL;
xmlNodePtr root_node = NULL, node = NULL, node1 = NULL; doc = xmlNewDoc(BAD_CAST "1.0"); // create a new xml document.
root_node = xmlNewNode(NULL, BAD_CAST "root"); // create a root node.
xmlDocSetRootElement(doc, root_node); xmlNewChild(root_node, NULL, BAD_CAST "node1", BAD_CAST "content of node1");
//xmlNewChild(root_node, NULL, BAD_CAST "node2", NULL); node = xmlNewChild(root_node, NULL, BAD_CAST "node3", BAD_CAST "node3 has attributes");
xmlNewProp(node, BAD_CAST "attribute", BAD_CAST "yes"); node = xmlNewNode(NULL, BAD_CAST "node4");
node1 = xmlNewText(BAD_CAST
"other way to create content (which is also a node)");
xmlAddChild(node, node1);
xmlAddChild(root_node, node); xmlSaveFormatFileEnc(argc > ? argv[] : "-", doc, "UTF-8", ); xmlFreeDoc(doc); xmlCleanupParser(); xmlMemoryDump();
return();
}
libxml的api使用 const unsigned char* 。
而string literal 只能隐式转换到 const char*。
所以libxml提供一个BAD_CAST用来作显示转换。
代码应该不难看懂,生成的xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<node1>content of node1</node1>
<node3 attribute="yes">node3 has attributes</node3>
<node4>other way to create content (which is also a node)</node4>
</root>
xml文件和创建xml的代码对照着看就很容易看懂如何生成节点以及属性了。
解析xml
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libxml/parser.h>
#include <libxml/xmlmemory.h> int main(int argc, char **argv)
{
xmlDocPtr doc;
xmlNodePtr curNode; xmlKeepBlanksDefault();
doc = xmlReadFile("mine.xml", "UTF-8", XML_PARSE_RECOVER); // open a xml doc.
curNode = xmlDocGetRootElement(doc); // get root element. if (curNode == NULL)
{
fprintf(stderr, "open file failed. \n");
xmlFreeDoc (doc);
return -;
} if (xmlStrcmp(curNode->name, "root")) // if the same,xmlStrcmp return 0, else return 1
{
fprintf(stderr, "check rootElement failed. \n");
xmlFreeDoc (doc);
return -;
} curNode = curNode->children; // move to root element's children.
char *nodeName;
char *content; if (curNode != NULL)
{
nodeName = (char *) curNode->name;
content = (char *) xmlNodeGetContent(curNode);
printf ("Current node name:%s,\t the content is:%s.\n\n", nodeName, content);
} curNode = curNode->next;
char *attr;
if (curNode != NULL)
{
nodeName = (char *) curNode->name;
content = (char *) xmlNodeGetContent(curNode);
attr = (char *) xmlGetProp(curNode, (const xmlChar *)"attribute"); // get node attribute
printf ("Current node name:%s,\t the content is:%s,\t AND THE ATTR IS:%s.\n\n", nodeName, content,attr);
} curNode = curNode->next;
if (curNode != NULL)
{
nodeName = (char *) curNode->name;
content = (char *) xmlNodeGetContent(curNode);
printf ("Current node name:%s,\t the content is:%s.\n\n", nodeName, content);
} xmlFree(curNode);
xmlFreeDoc(doc);
return ;
}
上面的代码是简单的按生成的xml结构来解析,
正确的用法应该是写成一个函数来调用,
可以解析任何的已知根节点的xml文件。
解析的结果输入如下:
[nigelzeng@ubuntu xml-learning]$ ./xml-mine-parse
Current node name:node1, the content is:content of node1. Current node name:node3, the content is:node3 has attributes, AND THE ATTR IS:yes. Current node name:node4, the content is:other way to create content (which is also a node).
参考:
http://www.cppblog.com/lymons/archive/2009/03/30/37553.html
http://www.4ucode.com/Study/Topic/1622022
使用libxml2创建和解析xml文件的更多相关文章
- 使用dom4j创建和解析xml文件
使用dom4j创建和解析xml文件 在项目开发中,我们经常会遇到xml文件的创建和解析从别人接口得到的xml文件,而我们最常使用的组件是dom4j. 下面我就以代码来讲解一下如何使用dom4j来创建x ...
- Java 创建过滤器 解析xml文件
今天写了一个过滤器demo,现在是解析actions.xml文件,得到action中的业务规则:不需要导入任何jar包 ActionFilter过滤器类: package accp.com.xh.ut ...
- PHP使用SimpleElement创建和解析xml文件
<!-- 使用SimpleXMLElement生成xml文件 --><?php//生成一个xml文件 //xml字符串$_xml = <<<_xml<?xml ...
- PHP使用 DOMDocument创建和解析xml文件
<!-- DOMDocument生成XML文件 --><?php//声明一个DOMDocument对象$_doc=new DOMDocument('1.0', 'utf-8'); / ...
- Java解析XML文件的方式
在项目里,我们往往会把一些配置信息放到xml文件里,或者各部门间会通过xml文件来交换业务数据,所以有时候我们会遇到“解析xml文件”的需求.一般来讲,有基于DOM树和SAX的两种解析xml文件的方式 ...
- Dom4j解析Xml文件,Dom4j创建Xml文件
Dom4j解析Xml文件,Dom4j创建Xml文件 >>>>>>>>>>>>>>>>>>&g ...
- 遍历文件 创建XML对象 方法 python解析XML文件 提取坐标计存入文件
XML文件??? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 里面的标签都是可以随心所欲的按照他的命名规则来定义的,文件名为roi.xm ...
- 创建xml文件、解析xml文件
1.创建XML文件: import codecs import xml.dom.minidom doc=xml.dom.minidom.Document() print doc root=do ...
- Android -- 创建XML文件对象及其序列化, pull解析XML文件
1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /** * 短信的业务bean * @author Administrat ...
随机推荐
- 1.利用BeanMap进行对象与Map的相互转换
javabean与map的转换有很多种方式,比如: 1.通过ObjectMapper先将bean转换为json,再将json转换为map,但是这种方法比较绕,且效率很低,经测试,循环转换10000个b ...
- evpp下载1个文件
上传一个文件无错误 如何下载一个文件?? 集群?? http pdf 直接 redbuf
- java中的strictfp的作用
自Java2以来,Java语言增加了一个关键字strictfp,虽然这个关键字在大多数场合比较少用,但是还是有必要了解一下. strictfp 的意思是FP-strict,也就是说精确浮点的意思.在J ...
- CF480E Parking Lot(two-pointers + 单调队列优化)
题面 动态加障碍物,同时查询最大子正方形. n,m≤2000n,m\leq2000n,m≤2000 题解 加障碍不好做,直接离线后反着做,每次就是清除一个障碍物. 显然倒着做答案是递增的,而且答案的值 ...
- Python 装饰器实现单列模式
# 使用装饰器实现单列模式 def singleton(cls): # 用来存在实例的字典 singleton_instance = {} def wrapper(*args, **kwargs): ...
- MyBatis和Spring整合案例
1.所需要导入的jar文件 !--MyBatis和Spring的整合包 由MyBatis提供--> <dependency> <groupId>org.mybatis&l ...
- 百度静态资源库CDN库, cdnjs库,引入JS
不适用本地引入js文件,而使用其他服务器引入JS文件,1,减轻服务器压力2,速度快3,可以缓存 cdnjs库,更新比较快https://cdnjs.com/ cdn库 引入JS文件如:jquerybo ...
- 一、RabbitMQ 基础理解
RabbitMQ,是一个使用 erlang 编写的 AMQP(高级消息队列协议)的服务实现,简单来说,就是一个功能强大的消息队列服务 概念理解: Producer: 消息发送者 RabbitMQ Vh ...
- 012——C#打开ecxel修改数据(附教程)
(一)参考文献:[C#]将数据写入已存在的excel文件 C# 导入excel数据,解决关闭excel后不能释放资源的问题 (二)视频教程:https://v.qq.com/x/page/p30063 ...
- Oracle 与 postgreSQL 事务处理区别(多版本与undo区别)
2015年左右,因为工作需要用MongoDB.CouchBase这两种文档型数据库,时不时到这两个数据库官网上查资料.报BUG.时常可以在MongoDB官网上看到这样一些新闻,“某某企业成功将MySQ ...