Credential resolver plugin
[shibboleth/cpp-xmltooling.git] / xmltooling / util / XMLHelper.cpp
index 7d61fdc..1bf8d5d 100644 (file)
@@ -133,75 +133,83 @@ const XMLCh* XMLHelper::getTextContent(const DOMElement* e)
     return NULL;\r
 }\r
 \r
-DOMElement* XMLHelper::getFirstChildElement(const DOMNode* n)\r
+DOMElement* XMLHelper::getFirstChildElement(const DOMNode* n, const XMLCh* localName)\r
 {\r
     DOMNode* child = n->getFirstChild();\r
     while (child && child->getNodeType() != DOMNode::ELEMENT_NODE)\r
         child = child->getNextSibling();\r
-    if (child)\r
-        return static_cast<DOMElement*>(child);\r
-    return NULL;\r
+    if (child && localName) {\r
+        if (!XMLString::equals(localName,child->getLocalName()))\r
+            return getNextSiblingElement(child, localName);\r
+    }\r
+    return static_cast<DOMElement*>(child);\r
 }    \r
 \r
-DOMElement* XMLHelper::getLastChildElement(const DOMNode* n)\r
+DOMElement* XMLHelper::getLastChildElement(const DOMNode* n, const XMLCh* localName)\r
 {\r
     DOMNode* child = n->getLastChild();\r
     while (child && child->getNodeType() != DOMNode::ELEMENT_NODE)\r
         child = child->getPreviousSibling();\r
-    if (child)\r
-        return static_cast<DOMElement*>(child);\r
-    return NULL;\r
+    if (child && localName) {\r
+        if (!XMLString::equals(localName,child->getLocalName()))\r
+            return getPreviousSiblingElement(child, localName);\r
+    }\r
+    return static_cast<DOMElement*>(child);\r
 }    \r
 \r
 DOMElement* XMLHelper::getFirstChildElement(const DOMNode* n, const XMLCh* ns, const XMLCh* localName)\r
 {\r
-    DOMElement* e = getFirstChildElement(n);\r
-    while (e && !isNodeNamed(e, ns, localName))\r
-        e = getNextSiblingElement(e);\r
+    DOMElement* e = getFirstChildElement(n, localName);\r
+    while (e && !XMLString::equals(e->getNamespaceURI(),ns))\r
+        e = getNextSiblingElement(e, localName);\r
     return e;\r
 }\r
 \r
 DOMElement* XMLHelper::getLastChildElement(const DOMNode* n, const XMLCh* ns, const XMLCh* localName)\r
 {\r
-    DOMElement* e = getLastChildElement(n);\r
-    while (e && !isNodeNamed(e, ns, localName))\r
-        e = getPreviousSiblingElement(e);\r
+    DOMElement* e = getLastChildElement(n, localName);\r
+    while (e && !XMLString::equals(e->getNamespaceURI(),ns))\r
+        e = getPreviousSiblingElement(e, localName);\r
     return e;\r
 }\r
 \r
-DOMElement* XMLHelper::getNextSiblingElement(const DOMNode* n)\r
+DOMElement* XMLHelper::getNextSiblingElement(const DOMNode* n, const XMLCh* localName)\r
 {\r
     DOMNode* sib = n->getNextSibling();\r
     while (sib && sib->getNodeType() != DOMNode::ELEMENT_NODE)\r
         sib = sib->getNextSibling();\r
-    if (sib)\r
-        return static_cast<DOMElement*>(sib);\r
-    return NULL;\r
+    if (sib && localName) {\r
+        if (!XMLString::equals(localName,sib->getLocalName()))\r
+            return getNextSiblingElement(sib, localName);\r
+    }   \r
+    return static_cast<DOMElement*>(sib);\r
 }\r
 \r
-DOMElement* XMLHelper::getPreviousSiblingElement(const DOMNode* n)\r
+DOMElement* XMLHelper::getPreviousSiblingElement(const DOMNode* n, const XMLCh* localName)\r
 {\r
     DOMNode* sib = n->getPreviousSibling();\r
     while (sib && sib->getNodeType() != DOMNode::ELEMENT_NODE)\r
         sib = sib->getPreviousSibling();\r
-    if (sib)\r
-        return static_cast<DOMElement*>(sib);\r
-    return NULL;\r
+    if (sib && localName) {\r
+        if (!XMLString::equals(localName,sib->getLocalName()))\r
+            return getPreviousSiblingElement(sib, localName);\r
+    }   \r
+    return static_cast<DOMElement*>(sib);\r
 }\r
 \r
 DOMElement* XMLHelper::getNextSiblingElement(const DOMNode* n, const XMLCh* ns, const XMLCh* localName)\r
 {\r
-    DOMElement* e = getNextSiblingElement(n);\r
-    while (e && !isNodeNamed(e, ns, localName))\r
-        e = getNextSiblingElement(e);\r
+    DOMElement* e = getNextSiblingElement(n, localName);\r
+    while (e && !XMLString::equals(e->getNamespaceURI(),ns))\r
+        e = getNextSiblingElement(e, localName);\r
     return e;\r
 }\r
 \r
 DOMElement* XMLHelper::getPreviousSiblingElement(const DOMNode* n, const XMLCh* ns, const XMLCh* localName)\r
 {\r
-    DOMElement* e = getPreviousSiblingElement(n);\r
-    while (e && !isNodeNamed(e, ns, localName))\r
-        e = getPreviousSiblingElement(e);\r
+    DOMElement* e = getPreviousSiblingElement(n, localName);\r
+    while (e && !XMLString::equals(e->getNamespaceURI(),ns))\r
+        e = getPreviousSiblingElement(e, localName);\r
     return e;\r
 }\r
 \r