Xerces-C++のサンプルコード

後々使うことになりそうだったので、備忘録として残しておく。
読み込んでいるXMLファイルは、Xerces-C++にサンプル用として含まれていたもの。

サンプルコード

#include <iostream>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <xercesc/dom/DOMNode.hpp>
#include <xercesc/dom/DOMText.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/sax/HandlerBase.hpp>

using namespace std;
using namespace xercesc;

void write(DOMNode* node);
void writeElement(DOMElement* element);
void writeText(DOMText* text);

void
write(DOMNode* node) {
	if (node) {
		switch (node->getNodeType()) {
		case DOMNode::ELEMENT_NODE:
			writeElement(static_cast<DOMElement*>(node));
			break;
		case DOMNode::TEXT_NODE:
			writeText(static_cast<DOMText*>(node));
			break;
		}

		DOMNode* child = node->getFirstChild();
		while (child) {
			DOMNode* next = child->getNextSibling();
			write(child);
			child = next;
		}
	}
}

void
writeElement(DOMElement* element) {
	char* name = XMLString::transcode(element->getTagName());
	cout << "tag    : " << name << endl;
	XMLString::release(&name);

	DOMNamedNodeMap* map = element->getAttributes();
	for (XMLSize_t i = 0; i < map->getLength(); i++) {
		DOMAttr* attr = static_cast<DOMAttr*>(map->item(i));
		char* attr_name  = XMLString::transcode(attr->getName());
		char* attr_value = XMLString::transcode(attr->getValue());
		cout << attr_name << ": "<< attr_value << endl;

		XMLString::release(&attr_name);
		XMLString::release(&attr_value);
	}
}

void
writeText(DOMText* text) {
	XMLCh* buffer = new XMLCh[XMLString::stringLen(text->getData()) + 1];
	XMLString::copyString(buffer, text->getData());
	XMLString::trim(buffer);
	char* content=XMLString::transcode(buffer);
	delete[] buffer;

	cout << "content: " << content << endl;
	XMLString::release(&content);
}

int main(int argc, char* args[]) {

	try {
		XMLPlatformUtils::Initialize();
	} catch (const XMLException& toCatch) {
		char* message = XMLString::transcode(toCatch.getMessage());
		cout << "Error during initialization! :\n" << message << "\n";
		XMLString::release(&message);
		return 1;
	}

	XercesDOMParser* parser = new XercesDOMParser();
	parser->setValidationScheme(XercesDOMParser::Val_Always);
	parser->setDoNamespaces(true); // optional

	ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
	parser->setErrorHandler(errHandler);

	const char* xmlFile = "samples/data/personal.xml";

	try {
		parser->parse(xmlFile);
		DOMDocument* dom = parser->getDocument();
		write(dom);
	} catch (const XMLException& toCatch) {
		char* message = XMLString::transcode(toCatch.getMessage());
		cout << "Exception message is: \n" << message << "\n";
		XMLString::release(&message);
		return -1;
	} catch (const DOMException& toCatch) {
		char* message = XMLString::transcode(toCatch.msg);
		cout << "Exception message is: \n" << message << "\n";
		XMLString::release(&message);
		return -1;
	} catch (...) {
		cout << "Unexpected Exception \n";
		return -1;
	}

	delete parser;
	delete errHandler;
	return 0;
}

実行結果

tag    : personnel
content: 
tag    : person
id: Big.Boss
content: 
tag    : name
tag    : family
content: Boss
content: 
tag    : given
content: Big
content: 
tag    : email
content: chief@foo.com
content: 
tag    : link
subordinates: one.worker two.worker three.worker four.worker five.worker
content: 
content: 
tag    : person
id: one.worker
content: 
tag    : name
tag    : family
content: Worker
content: 
tag    : given
content: One
content: 
tag    : email
content: one@foo.com
content: 
tag    : link
manager: Big.Boss
content: 
content: 
tag    : person
id: two.worker
content: 
tag    : name
tag    : family
content: Worker
content: 
tag    : given
content: Two
content: 
tag    : email
content: two@foo.com
content: 
tag    : link
manager: Big.Boss
content: 
content: 
tag    : person
id: three.worker
content: 
tag    : name
tag    : family
content: Worker
content: 
tag    : given
content: Three
content: 
tag    : email
content: three@foo.com
content: 
tag    : link
manager: Big.Boss
content: 
content: 
tag    : person
id: four.worker
content: 
tag    : name
tag    : family
content: Worker
content: 
tag    : given
content: Four
content: 
tag    : email
content: four@foo.com
content: 
tag    : link
manager: Big.Boss
content: 
content: 
tag    : person
id: five.worker
content: 
tag    : name
tag    : family
content: Worker
content: 
tag    : given
content: Five
content: 
tag    : email
content: five@foo.com
content: 
tag    : link
manager: Big.Boss
content: 
content: 

参考サイト