diff options
Diffstat (limited to 'src/uscxml/DOMUtils.cpp')
-rw-r--r-- | src/uscxml/DOMUtils.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/uscxml/DOMUtils.cpp b/src/uscxml/DOMUtils.cpp index 9703432..97b84c8 100644 --- a/src/uscxml/DOMUtils.cpp +++ b/src/uscxml/DOMUtils.cpp @@ -26,6 +26,9 @@ namespace uscxml { +using namespace Arabica::XPath; +using namespace Arabica::DOM; + bool DOMUtils::attributeIsTrue(const::std::string& value) { return stringIsTrue(value.c_str()); } @@ -126,6 +129,52 @@ std::string DOMUtils::xPathForNode(const Arabica::DOM::Node<std::string>& node, return xPath; } +NodeSet<std::string> DOMUtils::inPostFixOrder(const std::set<std::string>& elements, const Element<std::string>& root) { + NodeSet<std::string> nodes; + inPostFixOrder(elements, root, nodes); + return nodes; +} + +void DOMUtils::inPostFixOrder(const std::set<std::string>& elements, const Element<std::string>& root, NodeSet<std::string>& nodes) { + NodeList<std::string> children = root.getChildNodes(); + for (size_t i = 0; i < children.getLength(); i++) { + if (children.item(i).getNodeType() != Node_base::ELEMENT_NODE) + continue; + Arabica::DOM::Element<std::string> childElem(children.item(i)); + inPostFixOrder(elements, childElem, nodes); + + } + for (size_t i = 0; i < children.getLength(); i++) { + if (children.item(i).getNodeType() != Node_base::ELEMENT_NODE) + continue; + Arabica::DOM::Element<std::string> childElem(children.item(i)); + + if (elements.find(TAGNAME(childElem)) != elements.end()) { + nodes.push_back(childElem); + } + } +} + +NodeSet<std::string> DOMUtils::inDocumentOrder(const std::set<std::string>& elements, const Element<std::string>& root) { + NodeSet<std::string> nodes; + inDocumentOrder(elements, root, nodes); + return nodes; +} + +void DOMUtils::inDocumentOrder(const std::set<std::string>& elements, const Element<std::string>& root, NodeSet<std::string>& nodes) { + if (elements.find(TAGNAME(root)) != elements.end()) { + nodes.push_back(root); + } + + NodeList<std::string> children = root.getChildNodes(); + for (size_t i = 0; i < children.getLength(); i++) { + if (children.item(i).getNodeType() != Node_base::ELEMENT_NODE) + continue; + Arabica::DOM::Element<std::string> childElem(children.item(i)); + inDocumentOrder(elements, childElem, nodes); + } +} + 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; |