`
nigelzeng
  • 浏览: 605714 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用libxml2创建和解析xml文件

    博客分类:
  • C
阅读更多

毕业设计需要用到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

 

0
0
分享到:
评论

相关推荐

    Ubuntu下C语言使用libxml2库创建、解析xml文件

    以下将详细介绍如何在Ubuntu环境下使用libxml2库进行XML文件的创建和解析,以及节点的增、删、改、查操作。 1. 安装libxml2库 首先,你需要在Ubuntu系统上安装libxml2库及其开发头文件。这可以通过运行以下命令完成...

    libxml2-解析xml格式文件

    Libxml2库同样提供了XML文件生成的功能,主要通过`xmlNewDoc`和`xmlNewNode`等函数创建新的XML文档和节点。开发者可以通过添加、删除和修改节点来构建XML树,然后使用`xmlSaveFormatFileEnc`函数将树状结构保存为XML...

    libxml2生成,解析,修改xml文件

    利用libxml2生成,解析,修改xml文件示例,安装libxml2库, sudo apt-get install libxml2-dev。使用libxml2库进行xml文件的操作,取出了平台差异化,便于在不同的平台都可以进行文件的操作,不受平台系统的限制,...

    c++中使用libxml2读取xml文件

    本文详细介绍了如何在C++中使用libxml2来读取和解析XML文件。通过实例代码展示了如何加载XML文件、获取根节点、遍历子节点以及提取文本内容和属性值的过程。这些基础操作为更复杂的XML数据处理奠定了坚实的基础。在...

    libxml2test_xml_文本解析_capturedetv_

    `xmlReadFile`函数可以用来解析XML文件,并返回一个DOM文档结构。 在"libxml2test_xml_文本解析_capturedetv_"这个项目中,我们可能看到的是一个使用libxml2库编写的测试程序,该程序可能包括以下步骤: 1. 加载XML...

    libxml2.so库解析XML文件

    在“libxml2_test”这个文件中,很可能是包含了一些测试代码,用于演示如何使用libxml2库解析XML文件。这些代码可能涵盖上述提到的各个步骤,例如加载XML文件、执行XPath查询、遍历XML树结构等。通过阅读和分析这些...

    C语言解析XML,libxml包

    通过`xmlReadFile()`或`xmlParseDoc()`函数解析XML文件得到`xmlDocPtr`,之后可以使用`xmlDocGetRootElement()`获取根节点,再通过`xmlNode`结构体的成员函数遍历和操作XML树。 5. **XPath查询**: libxml2提供`...

    c++_libxml解析xml.doc

    C++ 使用 Libxml2 解析 XML 文件 ...本文介绍了使用 Libxml2 解析 XML 文件的详细步骤,包括下载和安装 Libxml2 库,编译和链接基于 Libxml2 的程序,以及使用 Makefile 文件简化编译和链接过程。

    LIBXML2相关文档

    1. **XML解析**:LIBXML2提供了解析XML文档的功能,它可以读取XML文件并将其转换为内存中的数据结构,这使得程序能够方便地访问和操作XML内容。解析过程包括了语法验证、命名空间处理、实体解析等。 2. **XPath支持...

    对libxml2封装的简单C++ xml操作类,libxml入门经典

    4. **解析XML**:解释如何使用libxml2解析XML文档,包括DOM(文档对象模型)和SAX(简单API for XML)两种方式,并可能提供示例代码。 5. **创建和修改XML**:介绍如何通过libxml2库创建新的XML文档,以及如何添加、...

    libxml2-2.9.8.rar_C语言解析XML_ITW_c语言XML解析器_joined4mf_windows 8

    1. **解析**: libxml2提供了解析XML文档的API,可以将XML字符串或文件转化为内存中的树结构,方便后续操作。解析过程中,libxml2能够处理命名空间、属性、注释和处理指令等元素。 2. **验证**: 支持DTD(Document ...

    开源跨平台XML解析器-LIBXML2--C源代码及VC6工程文件

    无论是解析XML文件、验证XML文档的结构,还是进行复杂的查询操作,LIBXML2都能够提供可靠的支持。通过研究和使用其源代码,开发者可以提升XML处理技能,并能够根据项目需求定制自己的XML解析解决方案。

    libxml2开源库 libxml2开源库 libxml2开源库

    例如,使用`xmlParseFile()`函数解析XML文件,使用`xmlDocGetRootElement()`获取文档的根元素,使用`xmlNodeListGetString()`提取节点内容等。 ### 3. 安装与编译 libxml2库通常可以通过包管理器在不同的操作系统...

    libxml2-2.9.1

    在实际开发中,开发者可以通过libxml2提供的API调用来实现XML相关的功能,例如读取XML文件、执行XPath查询、创建新的XML文档等。由于它的跨平台性,libxml2被广泛应用于各种操作系统和编程环境,包括Linux、Windows...

    2012.5.20libxml解析xml.rar

    - **读取和解析**:通过`xmlReadFile()`或`xmlParseMemory()`函数读取并解析XML文件或内存中的XML数据。 - **节点操作**:解析完成后,可以通过`xmlDoc`或`xmlNode`结构体访问和操作XML文档的节点。 4. **项目...

    xml.tar.gz_libxml2_linux c xml_linux xml

    在这个例子中,`xmlReadFile`函数读取XML文件并返回一个`xmlDocPtr`,表示解析后的文档。你可以通过`xmlDocGetRootElement`获取XML文档的根节点,然后遍历和操作节点。 使用libxml2的XPath功能,你可以编写查询来...

    libxml2源码文件

    作为C语言编写的库,libxml2提供了一系列API,方便开发者处理XML文档,如解析、创建、修改和序列化XML数据。它同时也支持其他相关的格式,如HTML、XHTML、SVG、XInclude、XPath和XSLT。 **1. XML解析** Libxml2的...

    libxml2 使用示例

    通过readNode,我们可以解析XML文件,获取特定节点的内容和属性。这个过程通常涉及打开XML文件,创建解析上下文,然后逐节点读取。 2. **countNode** countNode函数用于统计XML文档中的节点数量,这在需要了解文档...

    基于libxml2的c语言示例代码

    libxml2是GNU项目的一个开源库,由Daniel Veillard开发,它为C语言提供了强大的XML处理功能,包括解析、创建、修改和序列化XML文档。本示例代码将带你了解如何在Linux平台上使用libxml2库进行XML解析。 首先,让...

    LIBXML2 X64位

    然后,可以使用libxml2提供的API来解析XML文档,例如: ```c++ xmlDocPtr doc = xmlParseFile("example.xml"); if (doc == NULL) { // 处理解析错误 } // 对解析后的XML进行操作... xmlFreeDoc(doc); ``` **核心...

Global site tag (gtag.js) - Google Analytics