diff --git a/XML/include/Poco/DOM/AbstractContainerNode.h b/XML/include/Poco/DOM/AbstractContainerNode.h index 60dc9589d..e0f7893b3 100644 --- a/XML/include/Poco/DOM/AbstractContainerNode.h +++ b/XML/include/Poco/DOM/AbstractContainerNode.h @@ -52,8 +52,8 @@ protected: void dispatchNodeRemovedFromDocument(); void dispatchNodeInsertedIntoDocument(); - - static const Node* findNode(XMLString::const_iterator& it, const XMLString::const_iterator& end, const Node* pNode, const NSMap* pNSMap); + + static const Node* findNode(XMLString::const_iterator& it, const XMLString::const_iterator& end, const Node* pNode, const NSMap* pNSMap, bool& indexBound); static const Node* findElement(const XMLString& name, const Node* pNode, const NSMap* pNSMap); static const Node* findElement(int index, const Node* pNode, const NSMap* pNSMap); static const Node* findElement(const XMLString& attr, const XMLString& value, const Node* pNode, const NSMap* pNSMap); diff --git a/XML/src/AbstractContainerNode.cpp b/XML/src/AbstractContainerNode.cpp index 52134ce09..f80833141 100644 --- a/XML/src/AbstractContainerNode.cpp +++ b/XML/src/AbstractContainerNode.cpp @@ -30,14 +30,14 @@ namespace XML { const XMLString AbstractContainerNode::WILDCARD(toXMLString("*")); -AbstractContainerNode::AbstractContainerNode(Document* pOwnerDocument): +AbstractContainerNode::AbstractContainerNode(Document* pOwnerDocument): AbstractNode(pOwnerDocument), _pFirstChild(0) { } -AbstractContainerNode::AbstractContainerNode(Document* pOwnerDocument, const AbstractContainerNode& node): +AbstractContainerNode::AbstractContainerNode(Document* pOwnerDocument, const AbstractContainerNode& node): AbstractNode(pOwnerDocument, node), _pFirstChild(0) { @@ -199,7 +199,7 @@ Node* AbstractContainerNode::replaceChild(Node* newChild, Node* oldChild) AbstractNode* pCur = _pFirstChild; while (pCur && pCur->_pNext != oldChild) pCur = pCur->_pNext; if (pCur) - { + { poco_assert_dbg (pCur->_pNext == oldChild); if (doEvents) @@ -311,8 +311,9 @@ bool AbstractContainerNode::hasAttributes() const Node* AbstractContainerNode::getNodeByPath(const XMLString& path) const { + bool indexBound; XMLString::const_iterator it = path.begin(); - if (it != path.end() && *it == '/') + if (it != path.end() && *it == '/') { ++it; if (it != path.end() && *it == '/') @@ -327,20 +328,21 @@ Node* AbstractContainerNode::getNodeByPath(const XMLString& path) const for (unsigned long i = 0; i < length; i++) { XMLString::const_iterator beg = it; - const Node* pNode = findNode(beg, path.end(), pList->item(i), 0); + const Node* pNode = findNode(beg, path.end(), pList->item(i), 0, indexBound); if (pNode) return const_cast(pNode); } return 0; } } - return const_cast(findNode(it, path.end(), this, 0)); + return const_cast(findNode(it, path.end(), this, 0, indexBound)); } Node* AbstractContainerNode::getNodeByPathNS(const XMLString& path, const NSMap& nsMap) const { + bool indexBound; XMLString::const_iterator it = path.begin(); - if (it != path.end() && *it == '/') + if (it != path.end() && *it == '/') { ++it; if (it != path.end() && *it == '/') @@ -368,19 +370,20 @@ Node* AbstractContainerNode::getNodeByPathNS(const XMLString& path, const NSMap& for (unsigned long i = 0; i < length; i++) { XMLString::const_iterator beg = it; - const Node* pNode = findNode(beg, path.end(), pList->item(i), &nsMap); + const Node* pNode = findNode(beg, path.end(), pList->item(i), &nsMap, indexBound); if (pNode) return const_cast(pNode); } } return 0; } } - return const_cast(findNode(it, path.end(), this, &nsMap)); + return const_cast(findNode(it, path.end(), this, &nsMap, indexBound)); } -const Node* AbstractContainerNode::findNode(XMLString::const_iterator& it, const XMLString::const_iterator& end, const Node* pNode, const NSMap* pNSMap) +const Node* AbstractContainerNode::findNode(XMLString::const_iterator& it, const XMLString::const_iterator& end, const Node* pNode, const NSMap* pNSMap, bool& indexBound) { + indexBound = false; if (pNode && it != end) { if (*it == '[') @@ -406,7 +409,8 @@ const Node* AbstractContainerNode::findNode(XMLString::const_iterator& it, const while (it != end && *it != ']') value += *it++; } if (it != end) ++it; - return findNode(it, end, findElement(attr, value, pNode, pNSMap), pNSMap); + bool ib; + return findNode(it, end, findElement(attr, value, pNode, pNSMap), pNSMap, ib); } else { @@ -416,17 +420,19 @@ const Node* AbstractContainerNode::findNode(XMLString::const_iterator& it, const } else { - XMLString index; - while (it != end && *it != ']') index += *it++; + XMLString xmlIndex; + while (it != end && *it != ']') xmlIndex += *it++; if (it != end) ++it; #ifdef XML_UNICODE_WCHAR_T - std::string idx; - Poco::UnicodeConverter::convert(index, idx); - int i = Poco::NumberParser::parse(idx); -#else + std::string index; + Poco::UnicodeConverter::convert(xmlIndex, index); int i = Poco::NumberParser::parse(index); +#else + int i = Poco::NumberParser::parse(xmlIndex); #endif - return findNode(it, end, findElement(i, pNode, pNSMap), pNSMap); + indexBound = true; + bool ib; + return findNode(it, end, findElement(i, pNode, pNSMap), pNSMap, ib); } } else @@ -440,8 +446,9 @@ const Node* AbstractContainerNode::findNode(XMLString::const_iterator& it, const const Node* pElem = findElement(key, pNode->firstChild(), pNSMap); while (!pFound && pElem) { - pFound = findNode(it, end, pElem, pNSMap); - if (!pFound) pElem = findElement(key, pElem->nextSibling(), pNSMap); + bool ib; + pFound = findNode(it, end, pElem, pNSMap, ib); + if (!pFound) pElem = ib ? nullptr : findElement(key, pElem->nextSibling(), pNSMap); it = itStart; } return pFound; diff --git a/XML/testsuite/src/ElementTest.cpp b/XML/testsuite/src/ElementTest.cpp index e109aa6a4..016cfa38a 100644 --- a/XML/testsuite/src/ElementTest.cpp +++ b/XML/testsuite/src/ElementTest.cpp @@ -45,15 +45,15 @@ void ElementTest::testAttributes() { AutoPtr pDoc = new Document; AutoPtr pElem = pDoc->createElement("elem"); - + assertTrue (!pElem->hasAttributes()); pElem->setAttribute("a1", "v1"); assertTrue (pElem->hasAttributes()); - + assertTrue (pElem->hasAttribute("a1")); assertTrue (pElem->getAttribute("a1") == "v1"); - + Attr* pAttr1 = pElem->getAttributeNode("a1"); assertTrue (pAttr1 != 0); assertTrue (pAttr1->name() == "a1"); @@ -63,19 +63,19 @@ void ElementTest::testAttributes() assertTrue (pAttr1->ownerElement() == pElem); assertTrue (pAttr1->ownerDocument() == pDoc); assertTrue (pAttr1->innerText() == "v1"); - + assertTrue (pAttr1->previousSibling() == 0); assertTrue (pAttr1->nextSibling() == 0); - + pAttr1->setValue("V1"); assertTrue (pElem->getAttribute("a1") == "V1"); - + pElem->setAttribute("a2", "v2"); assertTrue (pElem->hasAttribute("a1")); assertTrue (pElem->getAttribute("a1") == "V1"); assertTrue (pElem->hasAttribute("a2")); assertTrue (pElem->getAttribute("a2") == "v2"); - + Attr* pAttr2 = pElem->getAttributeNode("a2"); assertTrue (pAttr2 != 0); assertTrue (pAttr2->name() == "a2"); @@ -94,7 +94,7 @@ void ElementTest::testAttributes() pAttr3->setValue("v3"); pElem->setAttributeNode(pAttr3); pAttr3->release(); - + assertTrue (pElem->hasAttribute("a1")); assertTrue (pElem->getAttribute("a1") == "V1"); assertTrue (pElem->hasAttribute("a2")); @@ -108,7 +108,7 @@ void ElementTest::testAttributes() assertTrue (pAttr2->nextSibling() == pAttr3); assertTrue (pAttr3->previousSibling() == pAttr2); assertTrue (pAttr3->nextSibling() == 0); - + pAttr2 = pDoc->createAttribute("a2"); pAttr2->setValue("V2"); pElem->setAttributeNode(pAttr2); @@ -120,12 +120,12 @@ void ElementTest::testAttributes() assertTrue (pElem->getAttribute("a2") == "V2"); assertTrue (pElem->hasAttribute("a3")); assertTrue (pElem->getAttribute("a3") == "v3"); - + pAttr1 = pDoc->createAttribute("a1"); pAttr1->setValue("v1"); pElem->setAttributeNode(pAttr1); pAttr1->release(); - + assertTrue (pElem->hasAttribute("a1")); assertTrue (pElem->getAttribute("a1") == "v1"); assertTrue (pElem->hasAttribute("a2")); @@ -144,16 +144,16 @@ void ElementTest::testAttributes() assertTrue (pElem->getAttribute("a2") == "V2"); assertTrue (pElem->hasAttribute("a3")); assertTrue (pElem->getAttribute("a3") == "V3"); - + pElem->removeAttributeNode(pAttr3); assertTrue (!pElem->hasAttribute("a3")); - + pElem->removeAttribute("a1"); assertTrue (!pElem->hasAttribute("a1")); - + pElem->removeAttribute("a2"); assertTrue (!pElem->hasAttribute("a2")); - + assertTrue (!pElem->hasAttributes()); } @@ -162,20 +162,20 @@ void ElementTest::testAttributesNS() { AutoPtr pDoc = new Document; AutoPtr pElem = pDoc->createElementNS("urn:ns1", "p:elem"); - + assertTrue (pElem->namespaceURI() == "urn:ns1"); assertTrue (pElem->prefix() == "p"); assertTrue (pElem->tagName() == "p:elem"); assertTrue (pElem->localName() == "elem"); - + assertTrue (!pElem->hasAttributes()); pElem->setAttributeNS("urn:ns1", "a1", "v1"); assertTrue (pElem->hasAttributes()); - + assertTrue (pElem->hasAttributeNS("urn:ns1", "a1")); assertTrue (pElem->getAttributeNS("urn:ns1", "a1") == "v1"); - + Attr* pAttr1 = pElem->getAttributeNodeNS("urn:ns1", "a1"); assertTrue (pAttr1 != 0); assertTrue (pAttr1->name() == "a1"); @@ -186,16 +186,16 @@ void ElementTest::testAttributesNS() assertTrue (pAttr1->value() == "v1"); assertTrue (pAttr1->nodeValue() == "v1"); assertTrue (pAttr1->ownerElement() == pElem); - + pAttr1->setValue("V1"); assertTrue (pElem->getAttributeNS("urn:ns1", "a1") == "V1"); - + pElem->setAttributeNS("urn:ns1", "a2", "v2"); assertTrue (pElem->hasAttributeNS("urn:ns1", "a1")); assertTrue (pElem->getAttributeNS("urn:ns1", "a1") == "V1"); assertTrue (pElem->hasAttributeNS("urn:ns1", "a2")); assertTrue (pElem->getAttributeNS("urn:ns1", "a2") == "v2"); - + Attr* pAttr2 = pElem->getAttributeNodeNS("urn:ns1", "a2"); assertTrue (pAttr2 != 0); assertTrue (pAttr2->name() == "a2"); @@ -212,14 +212,14 @@ void ElementTest::testAttributesNS() pAttr3->setValue("v3"); pElem->setAttributeNodeNS(pAttr3); pAttr3->release(); - + assertTrue (pElem->hasAttributeNS("urn:ns1", "a1")); assertTrue (pElem->getAttributeNS("urn:ns1", "a1") == "V1"); assertTrue (pElem->hasAttributeNS("urn:ns1", "a2")); assertTrue (pElem->getAttributeNS("urn:ns1", "a2") == "v2"); assertTrue (pElem->hasAttributeNS("urn:ns2", "a3")); assertTrue (pElem->getAttributeNS("urn:ns2", "a3") == "v3"); - + pAttr2 = pDoc->createAttributeNS("urn:ns1", "a2"); pAttr2->setValue("V2"); pElem->setAttributeNodeNS(pAttr2); @@ -231,12 +231,12 @@ void ElementTest::testAttributesNS() assertTrue (pElem->getAttributeNS("urn:ns1", "a2") == "V2"); assertTrue (pElem->hasAttributeNS("urn:ns2", "a3")); assertTrue (pElem->getAttributeNS("urn:ns2", "a3") == "v3"); - + pAttr1 = pDoc->createAttributeNS("urn:ns1", "a1"); pAttr1->setValue("v1"); pElem->setAttributeNodeNS(pAttr1); pAttr1->release(); - + assertTrue (pElem->hasAttributeNS("urn:ns1", "a1")); assertTrue (pElem->getAttributeNS("urn:ns1", "a1") == "v1"); assertTrue (pElem->hasAttributeNS("urn:ns1", "a2")); @@ -258,13 +258,13 @@ void ElementTest::testAttributesNS() pElem->removeAttributeNode(pAttr3); assertTrue (!pElem->hasAttributeNS("urn:ns2", "a3")); - + pElem->removeAttributeNS("urn:ns1", "a1"); assertTrue (!pElem->hasAttributeNS("urn:ns1", "a1")); - + pElem->removeAttributeNS("urn:ns1", "a2"); assertTrue (!pElem->hasAttributeNS("urn:ns1", "a2")); - + assertTrue (!pElem->hasAttributes()); } @@ -276,7 +276,7 @@ void ElementTest::testAttrMap() AutoPtr pNNM = pElem->attributes(); assertTrue (pNNM->length() == 0); - + pElem->setAttribute("a1", "v1"); assertTrue (pNNM->length() == 1); assertTrue (pNNM->item(0)->nodeName() == "a1"); @@ -288,11 +288,11 @@ void ElementTest::testAttrMap() assertTrue (pNNM->getNamedItem("a1")->nodeName() == "a1"); assertTrue (pNNM->item(1)->nodeName() == "a2"); assertTrue (pNNM->getNamedItem("a2")->nodeName() == "a2"); - + Attr* pAttr = pDoc->createAttribute("a3"); pNNM->setNamedItem(pAttr); pAttr->release(); - + assertTrue (pNNM->length() == 3); assertTrue (pNNM->item(0)->nodeName() == "a1"); assertTrue (pNNM->getNamedItem("a1")->nodeName() == "a1"); @@ -304,11 +304,11 @@ void ElementTest::testAttrMap() pNNM->removeNamedItem("a2"); assertTrue (pNNM->length() == 2); assertTrue (!pElem->hasAttribute("a2")); - + pNNM->removeNamedItem("a3"); assertTrue (pNNM->length() == 1); assertTrue (!pElem->hasAttribute("a3")); - + pElem->removeAttribute("a1"); assertTrue (pNNM->length() == 0); } @@ -321,7 +321,7 @@ void ElementTest::testAttrMapNS() AutoPtr pNNM = pElem->attributes(); assertTrue (pNNM->length() == 0); - + pElem->setAttributeNS("urn:ns1", "a1", "v1"); assertTrue (pNNM->length() == 1); assertTrue (pNNM->item(0)->nodeName() == "a1"); @@ -333,11 +333,11 @@ void ElementTest::testAttrMapNS() assertTrue (pNNM->getNamedItem("a1")->nodeName() == "a1"); assertTrue (pNNM->item(1)->nodeName() == "a2"); assertTrue (pNNM->getNamedItem("a2")->nodeName() == "a2"); - + Attr* pAttr = pDoc->createAttributeNS("urn:ns2", "a3"); pNNM->setNamedItem(pAttr); pAttr->release(); - + assertTrue (pNNM->length() == 3); assertTrue (pNNM->item(0)->nodeName() == "a1"); assertTrue (pNNM->getNamedItemNS("urn:ns1", "a1")->nodeName() == "a1"); @@ -349,11 +349,11 @@ void ElementTest::testAttrMapNS() pNNM->removeNamedItemNS("urn:ns1", "a2"); assertTrue (pNNM->length() == 2); assertTrue (!pElem->hasAttributeNS("urn:ns1", "a2")); - + pNNM->removeNamedItemNS("urn:ns2", "a3"); assertTrue (pNNM->length() == 1); assertTrue (!pElem->hasAttributeNS("urn:ns2", "a3")); - + pElem->removeAttributeNS("urn:ns1", "a1"); assertTrue (pNNM->length() == 0); } @@ -365,13 +365,13 @@ void ElementTest::testElementsByTagName() AutoPtr pRoot = pDoc->createElement("root"); AutoPtr pNL1 = pRoot->getElementsByTagName("*"); AutoPtr pNL2 = pRoot->getElementsByTagName("elem"); - + assertTrue (pNL1->length() == 0); assertTrue (pNL2->length() == 0); - + AutoPtr pElem1 = pDoc->createElement("elem"); pRoot->appendChild(pElem1); - + assertTrue (pNL1->length() == 1); assertTrue (pNL2->length() == 1); assertTrue (pNL1->item(0) == pElem1); @@ -396,7 +396,7 @@ void ElementTest::testElementsByTagName() assertTrue (pNL1->item(2) == pElem3); assertTrue (pNL2->item(0) == pElem1); assertTrue (pNL2->item(1) == pElem3); - + AutoPtr pElem11 = pDoc->createElement("elem"); pElem1->appendChild(pElem11); @@ -449,13 +449,13 @@ void ElementTest::testElementsByTagNameNS() AutoPtr pNL1 = pRoot->getElementsByTagNameNS("*", "*"); AutoPtr pNL2 = pRoot->getElementsByTagNameNS("*", "elem"); AutoPtr pNL3 = pRoot->getElementsByTagNameNS("urn:ns1", "elem"); - + assertTrue (pNL1->length() == 0); assertTrue (pNL2->length() == 0); - + AutoPtr pElem1 = pDoc->createElementNS("urn:ns1", "elem"); pRoot->appendChild(pElem1); - + assertTrue (pNL1->length() == 1); assertTrue (pNL2->length() == 1); assertTrue (pNL3->length() == 1); @@ -486,7 +486,7 @@ void ElementTest::testElementsByTagNameNS() assertTrue (pNL2->item(0) == pElem1); assertTrue (pNL2->item(1) == pElem3); assertTrue (pNL3->item(0) == pElem1); - + AutoPtr pElem11 = pDoc->createElementNS("urn:ns1", "elem"); pElem1->appendChild(pElem11); @@ -550,12 +550,12 @@ void ElementTest::testInnerText() AutoPtr pElem1 = pDoc->createElement("elem1"); AutoPtr pText2 = pDoc->createTextNode("text2"); AutoPtr pText3 = pDoc->createTextNode("text3"); - + pElem1->appendChild(pText2); pRoot->appendChild(pText1); pRoot->appendChild(pElem1); pRoot->appendChild(pText3); - + XMLString innerText = pRoot->innerText(); assertTrue (innerText == "text1text2text3"); } @@ -569,17 +569,17 @@ void ElementTest::testChildElement() AutoPtr pElem2 = pDoc->createElement("elem2"); AutoPtr pElem3 = pDoc->createElement("elem3"); AutoPtr pElem4 = pDoc->createElement("elem3"); - + pRoot->appendChild(pElem1); pRoot->appendChild(pElem2); pRoot->appendChild(pElem3); pRoot->appendChild(pElem4); - + assertTrue (pRoot->getChildElement("elem1") == pElem1); assertTrue (pRoot->getChildElement("elem2") == pElem2); assertTrue (pRoot->getChildElement("elem3") == pElem3); assertTrue (pRoot->getChildElement("elem4") == 0); - + assertTrue (pElem1->getChildElement("elem11") == 0); } @@ -592,18 +592,18 @@ void ElementTest::testChildElementNS() AutoPtr pElem2 = pDoc->createElementNS("urn:ns", "elem2"); AutoPtr pElem3 = pDoc->createElementNS("urn:ns", "elem3"); AutoPtr pElem4 = pDoc->createElementNS("urn:ns", "elem3"); - + pRoot->appendChild(pElem1); pRoot->appendChild(pElem2); pRoot->appendChild(pElem3); pRoot->appendChild(pElem4); - + assertTrue (pRoot->getChildElementNS("urn:ns", "elem1") == pElem1); assertTrue (pRoot->getChildElementNS("urn:ns", "elem2") == pElem2); assertTrue (pRoot->getChildElementNS("urn:ns", "elem3") == pElem3); assertTrue (pRoot->getChildElementNS("urn:ns", "elem4") == 0); assertTrue (pRoot->getChildElementNS("urn:NS", "elem1") == 0); - + assertTrue (pElem1->getChildElementNS("urn:ns", "elem11") == 0); } @@ -616,7 +616,7 @@ void ElementTest::testNodeByPath() - + @@ -626,14 +626,15 @@ void ElementTest::testNodeByPath() - + + */ AutoPtr pDoc = new Document; - + AutoPtr pRoot = pDoc->createElement("root"); AutoPtr pElem1 = pDoc->createElement("elem1"); AutoPtr pElem11 = pDoc->createElement("elemA"); @@ -646,22 +647,27 @@ void ElementTest::testNodeByPath() AutoPtr pElem25 = pDoc->createElement("elemC"); AutoPtr pElem3 = pDoc->createElement("elem2"); AutoPtr pElem31 = pDoc->createElement("elemB"); - + AutoPtr pElem32 = pDoc->createElement("elemD"); + + pElem2->setAttribute("index", "0"); + pElem3->setAttribute("index", "1"); + pElem21->setAttribute("attr1", "value1"); pElem22->setAttribute("attr1", "value2"); pElem23->setAttribute("attr1", "value3"); - + pElem24->setAttribute("attr1", "value1"); pElem25->setAttribute("attr1", "value2"); - + pElem31->setAttribute("attr1", "value4"); - + pElem32->setAttribute("attr1", "value1"); + AutoPtr pElem241 = pDoc->createElement("elemC1"); AutoPtr pElem242 = pDoc->createElement("elemC2"); pElem241->setAttribute("attr1", "value1"); pElem24->appendChild(pElem241); pElem24->appendChild(pElem242); - + pElem1->appendChild(pElem11); pElem1->appendChild(pElem12); pElem2->appendChild(pElem21); @@ -669,42 +675,43 @@ void ElementTest::testNodeByPath() pElem2->appendChild(pElem23); pElem2->appendChild(pElem24); pElem2->appendChild(pElem25); - + pElem3->appendChild(pElem31); + pElem3->appendChild(pElem32); pRoot->appendChild(pElem1); - pRoot->appendChild(pElem2); + pRoot->appendChild(pElem2); pRoot->appendChild(pElem3); - + pDoc->appendChild(pRoot); - + Node* pNode = pRoot->getNodeByPath("/"); assertTrue (pNode == pRoot); - + pNode = pRoot->getNodeByPath("/elem1"); assertTrue (pNode == pElem1); - + pNode = pDoc->getNodeByPath("/root/elem1"); assertTrue (pNode == pElem1); - + pNode = pRoot->getNodeByPath("/elem2"); assertTrue (pNode == pElem2); - + pNode = pRoot->getNodeByPath("/elem1/elemA"); assertTrue (pNode == pElem11); - + pNode = pRoot->getNodeByPath("/elem1/elemA[0]"); assertTrue (pNode == pElem11); pNode = pRoot->getNodeByPath("/elem1/elemA[1]"); assertTrue (pNode == pElem12); - + pNode = pRoot->getNodeByPath("/elem1/elemA[2]"); assertTrue (pNode == 0); - + pNode = pRoot->getNodeByPath("/elem2/elemB"); assertTrue (pNode == pElem21); - + pNode = pRoot->getNodeByPath("/elem2/elemB[0]"); assertTrue (pNode == pElem21); @@ -716,7 +723,7 @@ void ElementTest::testNodeByPath() pNode = pRoot->getNodeByPath("/elem2/elemB[3]"); assertTrue (pNode == 0); - + pNode = pRoot->getNodeByPath("/elem2/elemB[@attr1]"); assertTrue (pNode && pNode->nodeValue() == "value1"); @@ -734,7 +741,7 @@ void ElementTest::testNodeByPath() pNode = pDoc->getNodeByPath("//elemB[@attr1='value1']"); assertTrue (pNode == pElem21); - + pNode = pDoc->getNodeByPath("//elemB[@attr1='value2']"); assertTrue (pNode == pElem22); @@ -750,11 +757,32 @@ void ElementTest::testNodeByPath() pNode = pDoc->getNodeByPath("//[@attr1='value1']"); assertTrue (pNode == pElem21); + pNode = pDoc->getNodeByPath("//[@attr1='value4']"); + assertTrue (pNode == pElem31); + pNode = pDoc->getNodeByPath("//[@attr1='value2']"); assertTrue (pNode == pElem22); pNode = pRoot->getNodeByPath("/elem2/*[@attr1='value2']"); assertTrue (pNode == pElem22); + + pNode = pDoc->getNodeByPath("/root/elem2[0]/elemC"); + assertTrue (pNode == pElem24); + + pNode = pDoc->getNodeByPath("/root/elem2[1]/elemC"); + assertTrue (pNode == 0); + + pNode = pDoc->getNodeByPath("/root/elem2[0]/elemD"); + assertTrue (pNode == 0); + + pNode = pDoc->getNodeByPath("/root/elem2[1]/elemD"); + assertTrue (pNode == pElem32); + + pNode = pDoc->getNodeByPath("/root/elem2[@index=0]/elemD"); + assertTrue (pNode == 0); + + pNode = pDoc->getNodeByPath("/root/elem2[@index=1]/elemD"); + assertTrue (pNode == pElem32); } @@ -779,10 +807,10 @@ void ElementTest::testNodeByPathNS() - + */ AutoPtr pDoc = new Document; - + AutoPtr pRoot = pDoc->createElementNS("urn:ns1", "ns1:root"); AutoPtr pElem1 = pDoc->createElementNS("urn:ns1", "ns1:elem1"); AutoPtr pElem11 = pDoc->createElementNS("urn:ns2", "ns2:elemA"); @@ -795,21 +823,21 @@ void ElementTest::testNodeByPathNS() AutoPtr pElem25 = pDoc->createElementNS("urn:ns2", "ns2:elemC"); AutoPtr pElem3 = pDoc->createElementNS("urn:ns1", "ns1:elem2"); AutoPtr pElem31 = pDoc->createElementNS("urn:ns2", "ns2:elemB"); - + pElem21->setAttributeNS("urn:ns2", "ns2:attr1", "value1"); pElem22->setAttributeNS("urn:ns2", "ns2:attr1", "value2"); pElem23->setAttributeNS("urn:ns2", "ns2:attr1", "value3"); pElem31->setAttributeNS("urn:ns2", "ns2:attr1", "value4"); - + pElem24->setAttributeNS("urn:ns2", "ns2:attr1", "value1"); pElem25->setAttributeNS("urn:ns2", "ns2:attr1", "value2"); - + AutoPtr pElem241 = pDoc->createElementNS("urn:ns2", "elemC1"); AutoPtr pElem242 = pDoc->createElementNS("urn:ns2", "elemC2"); pElem241->setAttributeNS("urn:ns2", "ns2:attr1", "value1"); pElem24->appendChild(pElem241); pElem24->appendChild(pElem242); - + pElem1->appendChild(pElem11); pElem1->appendChild(pElem12); pElem2->appendChild(pElem21); @@ -820,18 +848,18 @@ void ElementTest::testNodeByPathNS() pElem3->appendChild(pElem31); pRoot->appendChild(pElem1); - pRoot->appendChild(pElem2); + pRoot->appendChild(pElem2); pRoot->appendChild(pElem3); pDoc->appendChild(pRoot); - + Element::NSMap nsMap; nsMap.declarePrefix("ns1", "urn:ns1"); nsMap.declarePrefix("NS2", "urn:ns2"); - + Node* pNode = pRoot->getNodeByPathNS("/", nsMap); assertTrue (pNode == pRoot); - + pNode = pRoot->getNodeByPathNS("/ns1:elem1", nsMap); assertTrue (pNode == pElem1); @@ -840,22 +868,22 @@ void ElementTest::testNodeByPathNS() pNode = pRoot->getNodeByPathNS("/ns1:elem2", nsMap); assertTrue (pNode == pElem2); - + pNode = pRoot->getNodeByPathNS("/ns1:elem1/NS2:elemA", nsMap); assertTrue (pNode == pElem11); - + pNode = pRoot->getNodeByPathNS("/ns1:elem1/NS2:elemA[0]", nsMap); assertTrue (pNode == pElem11); pNode = pRoot->getNodeByPathNS("/ns1:elem1/NS2:elemA[1]", nsMap); assertTrue (pNode == pElem12); - + pNode = pRoot->getNodeByPathNS("/ns1:elem1/NS2:elemA[2]", nsMap); assertTrue (pNode == 0); - + pNode = pRoot->getNodeByPathNS("/ns1:elem2/NS2:elemB", nsMap); assertTrue (pNode == pElem21); - + pNode = pRoot->getNodeByPathNS("/ns1:elem2/NS2:elemB[0]", nsMap); assertTrue (pNode == pElem21); @@ -867,7 +895,7 @@ void ElementTest::testNodeByPathNS() pNode = pRoot->getNodeByPathNS("/ns1:elem2/NS2:elemB[3]", nsMap); assertTrue (pNode == 0); - + pNode = pRoot->getNodeByPathNS("/ns1:elem2/NS2:elemB[@NS2:attr1]", nsMap); assertTrue (pNode && pNode->nodeValue() == "value1"); @@ -888,7 +916,7 @@ void ElementTest::testNodeByPathNS() pNode = pDoc->getNodeByPathNS("//NS2:elemB[@NS2:attr1='value1']", nsMap); assertTrue (pNode == pElem21); - + pNode = pDoc->getNodeByPathNS("//NS2:elemB[@NS2:attr1='value2']", nsMap); assertTrue (pNode == pElem22); @@ -903,10 +931,10 @@ void ElementTest::testNodeByPathNS() pNode = pDoc->getNodeByPathNS("//[@NS2:attr1='value1']", nsMap); assertTrue (pNode == pElem21); - + pNode = pDoc->getNodeByPathNS("//[@NS2:attr1='value2']", nsMap); assertTrue (pNode == pElem22); - + pNode = pRoot->getNodeByPathNS("/ns1:elem2/*[@NS2:attr1='value2']", nsMap); assertTrue (pNode == pElem22); @@ -945,4 +973,4 @@ CppUnit::Test* ElementTest::suite() CppUnit_addTest(pSuite, ElementTest, testNodeByPathNS); return pSuite; -} +} \ No newline at end of file