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:
参考サイト
- Xerces-C++ XML Parser
- DOMで単純なプログラミング - Xerces/Xalan-C++ で XML
- 今回のサンプルは、上記サイトの情報を参考に属性も表示出来るようにしたもの。