diff options
| author | Rob Richards <rrichards@php.net> | 2004-01-10 11:50:25 +0000 |
|---|---|---|
| committer | Rob Richards <rrichards@php.net> | 2004-01-10 11:50:25 +0000 |
| commit | 394bf2ba5b457a5befed5a7fbadae0ce50e024d4 (patch) | |
| tree | 478abdaee2e072445bf18504a0f4e34bbf1cd2fe /ext/dom/nodelist.c | |
| parent | a72c1ab93be75e9e206e6ba90fe04c2676110e72 (diff) | |
| download | php-git-394bf2ba5b457a5befed5a7fbadae0ce50e024d4.tar.gz | |
XPath query returns nodelist object rather than array
Diffstat (limited to 'ext/dom/nodelist.c')
| -rw-r--r-- | ext/dom/nodelist.c | 73 |
1 files changed, 45 insertions, 28 deletions
diff --git a/ext/dom/nodelist.c b/ext/dom/nodelist.c index 9c56e48844..a15228b376 100644 --- a/ext/dom/nodelist.c +++ b/ext/dom/nodelist.c @@ -52,29 +52,35 @@ int dom_nodelist_length_read(dom_object *obj, zval **retval TSRMLS_DC) dom_nnodemap_object *objmap; xmlNodePtr nodep, curnode; int count = 0; + HashTable *nodeht; objmap = (dom_nnodemap_object *)obj->ptr; if (objmap->ht) { count = xmlHashSize(objmap->ht); } else { - nodep = dom_object_get_node(objmap->baseobj); - if (nodep) { - if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype == XML_ELEMENT_NODE) { - curnode = nodep->children; - if (curnode) { - count++; - while (curnode->next != NULL) { + if (objmap->nodetype == DOM_NODESET) { + nodeht = HASH_OF(objmap->baseobjptr); + count = zend_hash_num_elements(nodeht); + } else { + nodep = dom_object_get_node(objmap->baseobj); + if (nodep) { + if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype == XML_ELEMENT_NODE) { + curnode = nodep->children; + if (curnode) { count++; - curnode = curnode->next; + while (curnode->next != NULL) { + count++; + curnode = curnode->next; + } } - } - } else { - if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) { - nodep = xmlDocGetRootElement((xmlDoc *) nodep); } else { - nodep = nodep->children; + if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) { + nodep = xmlDocGetRootElement((xmlDoc *) nodep); + } else { + nodep = nodep->children; + } + curnode = dom_get_elements_by_tag_name_ns_raw(nodep, objmap->ns, objmap->local, &count, -1); } - curnode = dom_get_elements_by_tag_name_ns_raw(nodep, objmap->ns, objmap->local, &count, -1); } } } @@ -101,6 +107,8 @@ PHP_FUNCTION(dom_nodelist_item) dom_nnodemap_object *objmap; xmlNodePtr nodep, curnode; int count = 0; + HashTable *nodeht; + pval **entry; id = getThis(); @@ -119,22 +127,31 @@ PHP_FUNCTION(dom_nodelist_item) itemnode = php_dom_libxml_notation_iter(objmap->ht, index); } } else { - nodep = dom_object_get_node(objmap->baseobj); - if (nodep) { - if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype == XML_ELEMENT_NODE) { - curnode = nodep->children; - while (count < index && curnode != NULL) { - count++; - curnode = curnode->next; - } - itemnode = curnode; - } else { - if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) { - nodep = xmlDocGetRootElement((xmlDoc *) nodep); + if (objmap->nodetype == DOM_NODESET) { + nodeht = HASH_OF(objmap->baseobjptr); + if (zend_hash_index_find(nodeht, index, (void **) &entry)==SUCCESS) { + *return_value = **entry; + zval_copy_ctor(return_value); + return; + } + } else { + nodep = dom_object_get_node(objmap->baseobj); + if (nodep) { + if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype == XML_ELEMENT_NODE) { + curnode = nodep->children; + while (count < index && curnode != NULL) { + count++; + curnode = curnode->next; + } + itemnode = curnode; } else { - nodep = nodep->children; + if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) { + nodep = xmlDocGetRootElement((xmlDoc *) nodep); + } else { + nodep = nodep->children; + } + itemnode = dom_get_elements_by_tag_name_ns_raw(nodep, objmap->ns, objmap->local, &count, index); } - itemnode = dom_get_elements_by_tag_name_ns_raw(nodep, objmap->ns, objmap->local, &count, index); } } } |
