毕业设计需要用到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 > 1 ? argv[1] : "-", doc, "UTF-8", 1);
xmlFreeDoc(doc);
xmlCleanupParser();
xmlMemoryDump();
return(0);
}
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(0);
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 -1;
}
if (xmlStrcmp(curNode->name, "root")) // if the same,xmlStrcmp return 0, else return 1
{
fprintf(stderr, "check rootElement failed. \n");
xmlFreeDoc (doc);
return -1;
}
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 1;
}
上面的代码是简单的按生成的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://xmlsoft.org/index.html
http://www.cppblog.com/lymons/archive/2009/03/30/37553.html
http://www.4ucode.com/Study/Topic/1622022
分享到:
相关推荐
Ubuntu下C语言使用libxml2库创建、解析xml文件,包括对节点的增、删、改、查等
利用libxml2生成,解析,修改xml文件示例,安装libxml2库, sudo apt-get install libxml2-dev。使用libxml2库进行xml文件的操作,取出了平台差异化,便于在不同的平台都可以进行文件的操作,不受平台系统的限制,...
在linux下有个很方便的操作xml文件的库——libxml2,它提供了一套创建和查询xml文件的C语言的接口。
Libxml是一个实现读、创建及操纵XML数据功能的C语言库。这个指南提供例子代码并给出它基本功能的解释。在这个项目的主页上有Libxml及更多关于它可用的资料。包含有完整的API文档。这个指南并不能替代这些完整的文档...
libxml2的安装及使用.跨平台。xml广泛应用于网络数据交换,配置文件、Web服务等等。近段时间项目中做一些配置文件,原来是用ini,现在...本文重点介绍解析xml的libxml2库的安装及使用,举例说明创建和解析xml的过程。
将XML文件或字符串解析为树 访问XML树结构 创建一个XML树 将XML树导出为字符串或XML文件 设置 像其他Julia程序包一样,您可以从常规注册表中检出LightXML ,如下所示: Pkg . add ( " LightXML " ) 注意:该...
另一方面,`lxml`库是一个强大的XML和HTML处理库,基于libxml2和libxslt库。它提供了高效的API,使您能够解析和操作XML和HTML文档。`lxml`具有出色的性能和灵活性,适用于处理复杂的HTML文档,例如网页解析和数据...
创建该库的目的是为了便于快速构建网页,尽管它还包括用于处理已解析的xml的工具。 esxml.el的代码生成 该库提供xml代码生成的格式。 主要形式是esxml。 esxml是由诸如libxml-parse-xml-region之类的函数返回的格式...
dom.el 最好的纯 emacs-lisp DOM 操作 ... 您可以使用dom-make-document-from-xml和来自libxml-parse-xml-region的输入从 XML 创建 DOM。 有关示例,请参阅下面的函数文档 关于接口和类 这个 elisp DOM 实现使用 dom-
D - I - N - K - Y 这是一个示例项目,使用: 获取网页提取页面内容拉出正文并清理创建 ePub 文件它依赖于其他工具: HTML、XML 解析、生成和处理库是一个 XML 工具包,是 C 库 libxml2 和 libxslt 的 Pythonic 绑定...
尿尿urllib2 xml文件曲奇库配置解析器 在 Debian 上安装 lxml 需要以下文件。 apt-get install libxml2-dev libxslt1-dev 参考: 操作方法 1、复制application.ini.origin创建application.ini。更正以下内容。 ...