xerces-c用DOM方式操作xml

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/details/46813853

xerces-c是一个可以校验XML合法性的XML解析器,它的语言是C++,它的官方主页:http://xml.apache.org/xerces-c。它支持下面这些标准:XML 1.0 ,XML 1.1 ,DOM 1, 2, 3 , SAX 1.0 和SAX 2.0, XML Schema。

xerces操作XML主要是分几步:

  1. 先调用XMLPlatformUtils::Initialize初始化环境,其中最重要是初始化内存管理器。如果没有调用这个,直接进行下面的步骤,程序会崩溃。
  2. 使用XercesDOMParser::parse方法来解析XML
  3. 使用XercesDOMParser::getDocument来DOMDocument对象指针
  4. 通过调用DOMDocument::getDocumentElement从DOMDocument对象指针里获取文档的主节点的指针,类型为DOMElement

用一个例子来演示一下:

address.xml:

<?xml version="1.0" encoding="utf-8"?>
<Address>
    <Recipient>Mr. Walter C. Brown</Recipient>
    <House>49</House>
    <Street>Featherstone Street</Street>
    <Town>LONDON</Town>
    <PostCode>EC1Y 8SY</PostCode>
    <Country>UK</Country>
</Address>

address.cpp:

#include <stdio.h>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/sax/SAXException.hpp>
#include <xercesc/dom/DOMException.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <xercesc/dom/DOMLSException.hpp>

using namespace XERCES_CPP_NAMESPACE;

int main(int argc, char* argv[] )
{
	if ( argc < 2 )
	{
		printf( "must specify a file\n" );
		return -1;
	}

	XMLPlatformUtils::Initialize();

	XercesDOMParser parser;
	try
	{
		parser.parse( argv[1] );
  	} catch ( SAXException& e )
	{ 
 		printf( "msg:%s\n", XMLString::transcode(e.getMessage() ) );
		 return -2;
	 }
	catch ( XMLException& e )
	{
		printf( "code:%d, msg:%s\n", e.getCode(), XMLString::transcode( e.getMessage() ) );
		return -3;
	}
	catch (	DOMException& e )
	{
		printf( "code:%d, msg:%s\n", e.code, e.msg );
		return -4;
	}

	DOMDocument* pDoc = NULL;

	try 
	{
		pDoc = parser.getDocument();
	} catch ( DOMLSException& e )
	{
		printf( "code:%d, msg:%s\n", e.code, e.msg );
		return -5;
	} catch ( DOMException& e )
	{
		printf( "code:%d, msg:%s\n", e.code, e.msg );
		return -6;
	}

	DOMElement* root = pDoc->getDocumentElement();
	if ( root == NULL )
	{
		return -7;
	}

	DOMElement* child = root->getFirstElementChild();
	XMLSize_t cnt = root->getChildElementCount();
	for ( XMLSize_t i = 0; i < cnt; i++ )
	{
		char* name = XMLString::transcode( child->getTagName() );
		printf( "%s=", name );
		XMLString::release( &name);

		char* value = XMLString::transcode(child->getTextContent());
		printf( "%s\n", value );
		XMLString::release( &value );

		child = child->getNextElementSibling();
	}

	return 0;
}

编译:

[xuzhina@localhost sample]$ g++ -g -o address address.cpp -lxerces-c

运行结果:

[xuzhina@localhost sample]$ ./address address.xml
Recipient=Mr. Walter C. Brown
House=49
Street=Featherstone Street
Town=LONDON
PostCode=EC1Y 8SY
Country=UK

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏noteless

[二十一]JavaIO之BufferedReader 与 BufferedWriter

BufferedReader  从字符输入流中读取文本,内部缓冲各个字符,从而实现字符、数组和行的高效读取

1611
来自专栏Golang语言社区

GO语言标准库概览

在Go语言五周系列教程的最后一部分中,我们将带领大家一起来浏览一下Go语言丰富的标准库。 Go标准库包含了大量包,提供了丰富广泛的功能特性。这里提供了概览仅仅是...

2854
来自专栏分布式系统进阶

Kafka中的时间轮Kafka源码分析-汇总

将TimerTask对象绑定到 TimerTaskEntry上 如果这个TimerTask对象之前已经绑定到了一个 TimerTaskEntry上, 先调用t...

1941
来自专栏Elson's web

Promise 原理探究

你真的了解Promise吗?对我而言,除了知道如何使用then解决回调地狱以外,其他的还真的一知半解。虽然ES6的generator和ES7的async awa...

6305
来自专栏Golang语言社区

GO语言标准库概览

在Go语言五周系列教程的最后一部分中,我们将带领大家一起来浏览一下Go语言丰富的标准库。 Go标准库包含了大量包,提供了丰富广泛的功能特性。这里提供了概览仅仅是...

38410
来自专栏吴柯的运维笔记

48个Shell脚本小技巧(二)

23. 产生一个随机数 代码如下: echo $RANDOM 24. 按照模式split 文件 代码如下: csplit server.log ...

3387
来自专栏Java架构沉思录

优雅实现延时任务之zookeeper篇

在《优雅实现延时任务之Redis篇》一文中提到,实现延时任务的关键点,是要存储任务的描述和任务的执行时间,还要能根据任务执行时间进行排序,那么我们可不可以使用z...

3793
来自专栏何俊林

Android开发基础规范(一)

【小提醒】阅读本文约耗时3分钟左右。 前言:Android中一些开发规范,避免给自己和别人少留坑。 一、工程相关 1.1 工程结构 当进行提交代码的工作时,工...

1997
来自专栏java思维导图

Java 10 已发布!时隔 6 月带来 109 项新特性

关键时刻,第一时间送达! 期待已久,没有跳票的 Java 10 已正式发布! ? 为了更快地迭代,以及跟进社区反馈,Java 的版本发布周期变更为了每六个月一次...

2937
来自专栏10km的专栏

java:学习commons-configuration2读取配置文件xml,properties

commons-configuration是apache为java应用程序提供的一个通用的配置文件管理接口,可以支持多种配置文件格式: Properties ...

4225

扫码关注云+社区

领取腾讯云代金券