Skip to content

Commit 3084e72

Browse files
author
Rob Richards
committed
fix getElementsByTagname iteration
1 parent 862a7e5 commit 3084e72

File tree

2 files changed

+20
-14
lines changed

2 files changed

+20
-14
lines changed

ext/dom/dom_iterators.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,11 +183,11 @@ static void php_dom_iterator_move_forward(zend_object_iterator *iter TSRMLS_DC)
183183
{
184184
zval *curobj, *curattr = NULL;
185185
zval *object;
186-
xmlNodePtr curnode = NULL;
186+
xmlNodePtr curnode = NULL, basenode;
187187
dom_object *intern;
188188
dom_object *nnmap;
189189
dom_nnodemap_object *objmap;
190-
int ret, previndex=0;
190+
int ret, previndex=1;
191191

192192
php_dom_iterator *iterator = (php_dom_iterator *)iter;
193193

@@ -203,8 +203,12 @@ static void php_dom_iterator_move_forward(zend_object_iterator *iter TSRMLS_DC)
203203
if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype == XML_ELEMENT_NODE) {
204204
curnode = curnode->next;
205205
} else {
206-
previndex = iter->index - 1;
207-
curnode = dom_get_elements_by_tag_name_ns_raw(curnode, objmap->ns, objmap->local, &previndex, iter->index);
206+
/* Nav the tree evey time as this is LIVE */
207+
basenode = dom_object_get_node(objmap->baseobj);
208+
if (basenode && (basenode->type == XML_DOCUMENT_NODE || basenode->type == XML_HTML_DOCUMENT_NODE)) {
209+
basenode = xmlDocGetRootElement((xmlDoc *) basenode);
210+
}
211+
curnode = dom_get_elements_by_tag_name_ns_raw(basenode, objmap->ns, objmap->local, &previndex, iter->index);
208212
}
209213
} else {
210214
if (objmap->nodetype == XML_ENTITY_NODE) {

ext/dom/php_dom.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,18 +1092,20 @@ xmlNode *dom_get_elements_by_tag_name_ns_raw(xmlNodePtr nodep, char *ns, char *l
10921092
xmlNodePtr ret = NULL;
10931093

10941094
while (nodep != NULL && (*cur <= index || index == -1)) {
1095-
if (nodep->type == XML_ELEMENT_NODE && xmlStrEqual(nodep->name, local)) {
1096-
if (ns == NULL || (nodep->ns != NULL && xmlStrEqual(nodep->ns->href, ns))) {
1097-
if (*cur == index) {
1098-
ret = nodep;
1099-
break;
1095+
if (nodep->type == XML_ELEMENT_NODE) {
1096+
if (xmlStrEqual(nodep->name, local)) {
1097+
if (ns == NULL || (nodep->ns != NULL && xmlStrEqual(nodep->ns->href, ns))) {
1098+
if (*cur == index) {
1099+
ret = nodep;
1100+
break;
1101+
}
1102+
(*cur)++;
11001103
}
1101-
(*cur)++;
11021104
}
1103-
}
1104-
ret = dom_get_elements_by_tag_name_ns_raw(nodep->children, ns, local, cur, index);
1105-
if (ret != NULL) {
1106-
break;
1105+
ret = dom_get_elements_by_tag_name_ns_raw(nodep->children, ns, local, cur, index);
1106+
if (ret != NULL) {
1107+
break;
1108+
}
11071109
}
11081110
nodep = nodep->next;
11091111
}

0 commit comments

Comments
 (0)