xml文件解析(二)——运用libxml2库解析xml文件

使用libxml2库来生成和解析xml文件 1. 创建一个 XML 文档流程如下: 用 xmlNewDoc 函数创建一个文档指针 doc; 用 xmlNewNode 函数创建一个节点指针 root_node; 用 xmlDocSetRootElement 将 root_node 设置为 doc 的根节点; 给 root_node 添加一系列子节点,并设置字节点的内容和属性; 用 xmlSaveFile 保存 xml 到文件; 阅读详情

如何解析一个xml文件呢,我们可以使用libxml2库。

libxml2解析xml文件的要点是需要理解xml文档的树形结构,弄懂三个指针root,children及next,其分别代表父、子及同胞关系。

安装libxml2:

依赖:需要安装python-devel ——yuminstall python-devel

         安装libxml2——./configure; make; make install

主要函数:

xmlDocPtr xmlParseFile(const char *filename);

xmlDocPtr xmlParseMemory(const char *buffer, int size);

xmlNodePtr xmlDocGetRootElement(constxmlDoc* doc);

xmlChar * xmlNodeGetContent(const xmlNode*cur);

xmlChar * xmlGetProp(const xmlNode *node,const xmlChar *name);

xmlFree(xmlNodePtr)

xmlFreeDoc(xmlDocPtr)

实例:

testXml.cpp

#include <iostream>
#include <libxml/parser.h>
#include <string>
using namespace std;
void parseXmlNode(const xmlNodePtr & xmlRootNode);

const char* xmlFilename = "bookstore.xml";

int main(){
	xmlDocPtr doc = xmlParseFile(xmlFilename);
	if(NULL == doc)
	{
		cout << "Parsed xmlFile failed!" << endl;
		return -1;
	}
	
	xmlNodePtr xmlRootNode = xmlDocGetRootElement(doc);
	if(NULL == xmlRootNode)
	{
		cout << "GetRootElement failed" << endl;
		xmlFreeDoc(doc);
		return -1;
	} 
	
	parseXmlNode(xmlRootNode);

	xmlFreeDoc(doc);
	return 0;
}

void parseXmlNode(const xmlNodePtr & xmlRootNode)
{
	xmlNodePtr xmlChildNode = xmlRootNode->xmlChildrenNode;
	while(NULL != xmlChildNode)
	{

		if(xmlChildNode->xmlChildrenNode != NULL)
		{
			cout << "" << (char *)xmlChildNode->name << ":";
			cout << "\t" << (char*)xmlNodeGetContent(xmlChildNode) << endl;
		}
		
		if (!xmlStrcmp(xmlChildNode->name, (const xmlChar*)"title"))
		{
			cout << "lang of " << (char *)xmlChildNode->name << " is " << (char *)xmlGetProp(xmlChildNode, (const xmlChar*)"lang") << endl;
		}
		
		if (xmlChildNode->xmlChildrenNode != NULL)
		{
			parseXmlNode(xmlChildNode);
		}
		xmlChildNode = xmlChildNode->next;
	}

	return ;
}

编译:

g++ testXml.cpp -I/usr/local/libxml2/include/libxml2/ -lxml2

其中/usr/local/libxml2/include/libxml2/指出了libxml文件夹的路径

输出:

book:	
  Everyday Italian 
  Giada De Laurentiis 
  2005 
  30.00 

title:	Everyday Italian
lang of title is en
author:	Giada De Laurentiis
year:	2005
price:	30.00
book:	
  Harry Potter 
  J K. Rowling 
  2005 
  29.99 

title:	Harry Potter
lang of title is en
author:	J K. Rowling
year:	2005
price:	29.99

其中bookstore.xml 如下:

<bookstore>
<book category="COOKING">
  <title lang="en">Everyday Italian</title> 
  <author>Giada De Laurentiis</author> 
  <year>2005</year> 
  <price>30.00</price> 
</book>
<book category="CHILDREN">
  <title lang="en">Harry Potter</title> 
  <author>J K. Rowling</author> 
  <year>2005</year> 
  <price>29.99</price> 
</book>
<bookstore>
利用libxml2解析xml文件 简单介绍libxml2的安装及基于C语言从xml文件中解析出相关内容。 阅读详情

相关推荐

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

在C语言中解析XML文件,需要先安装libxml2的开发包,使用下面命令安装  sudo apt-get install libxml++1.0-dev sudo apt-get install libxml++1.0-doc 安装完之后包含头文件就可以在C里面使用libxml2库了。 int xmlKeepBlanksDefault (int val)//设置是否忽略

Yao.GUET 1万+

Libxml 类库的教程(C语言)

Libxml 是一个 C 语言库,实现了用于读取、创建和操作 XML 数据的功能。这个教程提供了示例代码和基本功能的解释。更多关于 Libxml 的详细信息以及使用文档可以在项目主页上找到。这个教程并不能替代完整的文档,但它能说明使用库进行基本操作所需的函数。这个教程基于一个我用来编写文章的简单 XML 应用程序。格式包括元数据和文章的正文。解析文档。提取指定元素中的文本。添加一个元素及其内容。添加一个属性。提取属性的值。完整的示例代码在附录中包含。

891

libxml2.7.8 c++ 解析xml文件 中文转换

C++的XML编程经验――LIBXML2库使用指南 写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML库,而且它同时支持多种编程语言;2)LIBXML2库的Tutorial写得不太好,尤其是编码转换的部分,不适用于中文编码的转换;3)网上的大多数关于Libxml2的介绍仅仅是翻译了自带的资料,没有详

鱼思故渊的专栏 4148

libxml解析XML文档

目前三种最流行的开源 c/c++解析xml库:libxml、Xerces、expat ,且三者都是跨平台的。   Xerces-C++ (C++版本):http://xerces.apache.org/xerces-c/index.html  xerces2-j (java版本):http://xerces.apache.org/xerces2-j/ java版dom及sa

z507263441的专栏 1458

Libxml2库的编译和使用

Libxml2库提供了C语言解析和构造xml文档的接口,为后台C语言处理程序和前台应用程序提供了一种通用的通迅方式。 本文以libxml2-2.6.30版本来说明Libxml2库的使用方法。 1.    编译库文件 libxml2-2.6.30.tar.gz文件解压后,进入libxml2-2.6.30文件夹,顺序执行以下命令: chmod +x ./con

Python 5832

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

linux下,纯c++使用libxml2读取xml文件 下载libxml2 [url]ftp://ftp.xmlsoft.org/libxml2/libxml2-sources-2.7.1.tar.gz[/url] 常规方法进行安装 #tar xvzf libxml2-xxxx.tar.gz #./configure #make #make install 把libxml2下的

鱼思故渊的专栏 3050

使用libxml2解析XML文件

使用libxml2解析XML文件

hinewcc的博客 3001

libxml2 解析xml字符串

最近在封装一个sdk接口给内部使用的时候,原来项目都是用c++开发的,xml解析工具用的是:Tinyxml,挺不错,至少不用考虑内存释放问题。这也是c++资源管理的好处。。。 因为提供的是c的接口,所以tinyxml显然不能用了。后面就想到用libxml2,因为他用C语言开发的。网上想找现成的,结果发现都是解析文件的,记录一下解析xml字符串的过程吧,主要是内存的管理小心一点就OK了:

chenycbbc0101的博客 2460

【C++】使用libxml解析XML文件

OpenCV中使用FileStorage创建和解析XML文件。但FileStorage不能处理节点为空的情况,且对属性也不友好。例子见这里。libxml是C接口的处理xml文件的开源代码库。

小魏的修行路 1万+

[XML文档解析]libxml2对XML文件的创建、解析、查找、修改

一、创建XML文档: 我们使用xmlNewDoc()来创建XML文档,然后使用xmlNewNode(),xmlNewChild(),xmlNewProp(),xmlNewText()等函数向XML文件中添加节点及子节点,设置元素和属性,创建完毕后用xmlSaveFormatFileEnc()来保存XML文件到磁盘(该函数可以设置保存XML文件时的编码格式)。 示例1:   #in

鱼思故渊的专栏 4421

简谈libxml2库函数的使用

目录前言一、XML简介1.1 什么是XML1.2 XML 和 HTML 之间的差异1.3 浅谈个人对XML的理解二、libxml2简介三、libxml2库的安装四、libxml2中主要数据结构和常用函数4.1 主要数据结构4.2 常用函数总结 前言 在做4G拨号的时候,遇到从.xml文件获取数据的部分。所以趁机简单在菜鸟教程学习了xml。在使用libxml2库的时候,我们有必要先了解一下xml的语法规则。在了解xml的时候顺带又把HTML过了一下。 提示:以下是本篇文章正文内容,下面案例可供

persist_with的博客 4862

libxml2库解析带命名空间的xml文件

介绍如何使用libxml2解析带xmlns的xml文件

weixin_45084173的博客 1562

libxml2生成,解析,修改xml文件,以及使用实例

利用libxml2生成,解析,修改xml文件。1. 生成xml文件// createXmlFile.cpp #include &lt;stdio.h&gt; #include &lt;libxml/parser.h&gt; #include &lt;libxml/tree.h&gt; #include &lt;iostream&gt; using namespace std; int mai...

linux 6895

libxml2修改XML文件总结

libxml2修改XML文件总结

weixin_45084173的博客 1531

C++读写XML文件(libxml2库)

C++读写XML文件(libxml2库)

hfhhgfv的博客 881

深入理解libxml2在XML文本解析中的应用

XML(Extensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标记语言,其设计允许开发者自定义标记来描述数据。由于其强大的数据描述能力和跨平台、语言无关的特性,XML在各种数据交换和配置文件中得到了广泛应用。libxml2是一个开源的XML解析库,广泛用于C和C++语言的XML处理中。它支持XML和HTML的解析,并提供一套丰富的API,以支持节点的创建、编辑、查询和输出。libxml2以其速度、效率和遵循XML标准而闻名,使其成为许多项目不可或缺的部分。

weixin_42588672的博客 697

libxml库解析XML文件

  绪论Libxml是一个有免费许可的用于处理XML、可以轻松跨越多个平台的C语言库。Libxml实现了读、创建及操纵XML数据功能。    这个指南基于一个简单的XML应用。 数据类型Libxml 定义了许多数据类型,它隐藏了杂乱的来源以致你不必处理它除非你有特定的需要。xmlChar  替代char,使用UTF-8编码的一字节字符串。如果你的数据使用其它编码,它必须被转换到UTF-8才能使

armman的专栏 7622

libxml很好的学习教程

libxml教程libxml教程libxml教程libxml教程libxml教程libxml教程libxml教程libxml教程libxml教程libxml教程

上一篇: xml文件解析(一)——xml文件格式
下一篇: stl之空间配置器Allocator
LinuxG_G
博客等级 码龄15年 58粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值