#include "XMLNode.h" #include XMLNode::XMLNode(xmlNodePtr doc) : xmlNode(doc) { xmlNode->_private = this; } XMLNode::~XMLNode() { } std::string XMLNode::getName() const { if (!xmlNode->name) return ""; return std::string((const char*)xmlNode->name); } const std::string XMLNode::getContent() const { xmlChar *xmlString = xmlNodeGetContent(xmlNode); std::string string ((const char*)xmlString); xmlFree(xmlString); return string; } XMLNode::XMLNodeSet XMLNode::findChildren(const std::string& name) { XMLNode::XMLNodeSet children; for (xmlNodePtr child = xmlNode->children; child; child = child->next) { if(child->_private && (name.empty() || name == (const char*)child->name)) { children.push_back(reinterpret_cast(child->_private)); } } return children; } XMLNode* XMLNode::getFirstChild(const std::string& name) { for (xmlNodePtr child = xmlNode->children; child; child = child->next) { if(child->_private && (name.empty() || name == (const char*)child->name)) { return reinterpret_cast(child->_private); } } return NULL; } XMLNode::XMLSet XMLNode::getTextChildren() { XMLNode::XMLSet children; assert(xmlNode != NULL); for (xmlNodePtr child = xmlNode->children; child; child = child->next) { // check if name and/or type matches if (child->_private && child->type == XML_TEXT_NODE) { XMLTextNode* tn = reinterpret_cast(child->_private); if (!tn->isBlank()) children.push_back(tn); } } return children; } std::string XMLNode::getFirstText() { XMLNode::XMLSet set = getTextChildren(); if (set.size() <= 0) return ""; return set.front()->getContent(); } XMLNode::XMLSet XMLNode::getElementChildren() { XMLNode::XMLSet children; for (xmlNodePtr child = xmlNode->children; child; child = child->next) { // check if name and/or type matches if (child->_private && child->type == XML_ELEMENT_NODE) { XMLElement* e = reinterpret_cast(child->_private); children.push_back(e); } } return children; }