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

本文介绍如何利用libxml2库解析XML文件,并提供了一个具体的C++代码示例。通过安装必要的软件包并掌握关键函数的用法,可以有效地解析XML文档的结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

安装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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值