diff options
author | Stefan Radomski <radomski@tk.informatik.tu-darmstadt.de> | 2014-01-08 03:15:10 (GMT) |
---|---|---|
committer | Stefan Radomski <radomski@tk.informatik.tu-darmstadt.de> | 2014-01-08 03:15:10 (GMT) |
commit | a39086067c99ab691f704017ff853250469aa91a (patch) | |
tree | 7e7ad0598f5cdfc477aa08f9b833afb8cdf3b2ac /src/uscxml/DOMUtils.cpp | |
parent | 9629ef3f969e31dfd19efa27e62487fc46610416 (diff) | |
download | uscxml-a39086067c99ab691f704017ff853250469aa91a.zip uscxml-a39086067c99ab691f704017ff853250469aa91a.tar.gz uscxml-a39086067c99ab691f704017ff853250469aa91a.tar.bz2 |
Updated IM invoker for latest libpurple
Diffstat (limited to 'src/uscxml/DOMUtils.cpp')
-rw-r--r-- | src/uscxml/DOMUtils.cpp | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/src/uscxml/DOMUtils.cpp b/src/uscxml/DOMUtils.cpp index e54099e..c38b087 100644 --- a/src/uscxml/DOMUtils.cpp +++ b/src/uscxml/DOMUtils.cpp @@ -67,6 +67,42 @@ std::string DOMUtils::xPathForNode(const Arabica::DOM::Node<std::string>& node) return xPath; } +std::list<Arabica::DOM::Node<std::string> > DOMUtils::getElementsByType(const Arabica::DOM::Node<std::string>& root, Arabica::DOM::Node_base::Type type) { + std::list<Arabica::DOM::Node<std::string> > result; + std::list<Arabica::DOM::Node<std::string> > stack; + std::list<Arabica::DOM::Node<std::string> >::iterator stackIter; + + if (!root) + return result; + + stack.push_back(root); + while(stack.size() > 0) { +// for(stackIter = stack.begin(); stackIter != stack.end(); stackIter++) { +// std::cout << stackIter->getNodeType() << " " << stackIter->getLocalName() << " " << stackIter->getNodeValue() << std::endl; +// } +// std::cout << std::endl; + + Arabica::DOM::Node<std::string> currNode = stack.back(); + if (currNode.hasChildNodes()) { + stack.push_back(currNode.getFirstChild()); + continue; + } + + // roll back stack and pop everyone without next sibling + do { + currNode = stack.back(); + if (currNode.getNodeType() == type) + result.push_back(currNode); + stack.pop_back(); + if (currNode.getNextSibling()) { + stack.push_back(currNode.getNextSibling()); + break; + } + } while(stack.size() > 0); + } + return result; +} + NameSpacingParser NameSpacingParser::fromXML(const std::string& xml) { std::stringstream* ss = new std::stringstream(); (*ss) << xml; @@ -81,8 +117,8 @@ NameSpacingParser NameSpacingParser::fromInputSource(Arabica::SAX::InputSource<s NameSpacingParser parser; if(!parser.parse(source) || !parser.getDocument().hasChildNodes()) { if(parser._errorHandler.errorsReported()) { - LOG(ERROR) << "could not parse input:"; - LOG(ERROR) << parser._errorHandler.errors() << std::endl; +// LOG(ERROR) << "could not parse input:"; +// LOG(ERROR) << parser._errorHandler.errors() << std::endl; } else { Arabica::SAX::InputSourceResolver resolver(source, Arabica::default_string_adaptor<std::string>()); if (!resolver.resolve()) { |