毕业设计需要用到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环境下使用libxml2库进行XML文件的创建和解析,以及节点的增、删、改、查操作。 1. 安装libxml2库 首先,你需要在Ubuntu系统上安装libxml2库及其开发头文件。这可以通过运行以下命令完成...
Libxml2库同样提供了XML文件生成的功能,主要通过`xmlNewDoc`和`xmlNewNode`等函数创建新的XML文档和节点。开发者可以通过添加、删除和修改节点来构建XML树,然后使用`xmlSaveFormatFileEnc`函数将树状结构保存为XML...
利用libxml2生成,解析,修改xml文件示例,安装libxml2库, sudo apt-get install libxml2-dev。使用libxml2库进行xml文件的操作,取出了平台差异化,便于在不同的平台都可以进行文件的操作,不受平台系统的限制,...
本文详细介绍了如何在C++中使用libxml2来读取和解析XML文件。通过实例代码展示了如何加载XML文件、获取根节点、遍历子节点以及提取文本内容和属性值的过程。这些基础操作为更复杂的XML数据处理奠定了坚实的基础。在...
`xmlReadFile`函数可以用来解析XML文件,并返回一个DOM文档结构。 在"libxml2test_xml_文本解析_capturedetv_"这个项目中,我们可能看到的是一个使用libxml2库编写的测试程序,该程序可能包括以下步骤: 1. 加载XML...
在“libxml2_test”这个文件中,很可能是包含了一些测试代码,用于演示如何使用libxml2库解析XML文件。这些代码可能涵盖上述提到的各个步骤,例如加载XML文件、执行XPath查询、遍历XML树结构等。通过阅读和分析这些...
通过`xmlReadFile()`或`xmlParseDoc()`函数解析XML文件得到`xmlDocPtr`,之后可以使用`xmlDocGetRootElement()`获取根节点,再通过`xmlNode`结构体的成员函数遍历和操作XML树。 5. **XPath查询**: libxml2提供`...
C++ 使用 Libxml2 解析 XML 文件 ...本文介绍了使用 Libxml2 解析 XML 文件的详细步骤,包括下载和安装 Libxml2 库,编译和链接基于 Libxml2 的程序,以及使用 Makefile 文件简化编译和链接过程。
1. **XML解析**:LIBXML2提供了解析XML文档的功能,它可以读取XML文件并将其转换为内存中的数据结构,这使得程序能够方便地访问和操作XML内容。解析过程包括了语法验证、命名空间处理、实体解析等。 2. **XPath支持...
4. **解析XML**:解释如何使用libxml2解析XML文档,包括DOM(文档对象模型)和SAX(简单API for XML)两种方式,并可能提供示例代码。 5. **创建和修改XML**:介绍如何通过libxml2库创建新的XML文档,以及如何添加、...
1. **解析**: libxml2提供了解析XML文档的API,可以将XML字符串或文件转化为内存中的树结构,方便后续操作。解析过程中,libxml2能够处理命名空间、属性、注释和处理指令等元素。 2. **验证**: 支持DTD(Document ...
无论是解析XML文件、验证XML文档的结构,还是进行复杂的查询操作,LIBXML2都能够提供可靠的支持。通过研究和使用其源代码,开发者可以提升XML处理技能,并能够根据项目需求定制自己的XML解析解决方案。
例如,使用`xmlParseFile()`函数解析XML文件,使用`xmlDocGetRootElement()`获取文档的根元素,使用`xmlNodeListGetString()`提取节点内容等。 ### 3. 安装与编译 libxml2库通常可以通过包管理器在不同的操作系统...
在实际开发中,开发者可以通过libxml2提供的API调用来实现XML相关的功能,例如读取XML文件、执行XPath查询、创建新的XML文档等。由于它的跨平台性,libxml2被广泛应用于各种操作系统和编程环境,包括Linux、Windows...
- **读取和解析**:通过`xmlReadFile()`或`xmlParseMemory()`函数读取并解析XML文件或内存中的XML数据。 - **节点操作**:解析完成后,可以通过`xmlDoc`或`xmlNode`结构体访问和操作XML文档的节点。 4. **项目...
在这个例子中,`xmlReadFile`函数读取XML文件并返回一个`xmlDocPtr`,表示解析后的文档。你可以通过`xmlDocGetRootElement`获取XML文档的根节点,然后遍历和操作节点。 使用libxml2的XPath功能,你可以编写查询来...
作为C语言编写的库,libxml2提供了一系列API,方便开发者处理XML文档,如解析、创建、修改和序列化XML数据。它同时也支持其他相关的格式,如HTML、XHTML、SVG、XInclude、XPath和XSLT。 **1. XML解析** Libxml2的...
通过readNode,我们可以解析XML文件,获取特定节点的内容和属性。这个过程通常涉及打开XML文件,创建解析上下文,然后逐节点读取。 2. **countNode** countNode函数用于统计XML文档中的节点数量,这在需要了解文档...
libxml2是GNU项目的一个开源库,由Daniel Veillard开发,它为C语言提供了强大的XML处理功能,包括解析、创建、修改和序列化XML文档。本示例代码将带你了解如何在Linux平台上使用libxml2库进行XML解析。 首先,让...
然后,可以使用libxml2提供的API来解析XML文档,例如: ```c++ xmlDocPtr doc = xmlParseFile("example.xml"); if (doc == NULL) { // 处理解析错误 } // 对解析后的XML进行操作... xmlFreeDoc(doc); ``` **核心...