]> granicus.if.org Git - php/commitdiff
add parameter allowing node to be exported into existing Document context
authorRob Richards <rrichards@php.net>
Mon, 16 Jun 2008 15:44:22 +0000 (15:44 +0000)
committerRob Richards <rrichards@php.net>
Mon, 16 Jun 2008 15:44:22 +0000 (15:44 +0000)
add test
fix warnings

ext/xmlreader/php_xmlreader.c
ext/xmlreader/tests/expand.phpt [new file with mode: 0644]

index 134446ef189d5fcbc4477a63819b6f3c51053a04..ea674efb66f76015df835084f7b3af68c05967dd 100644 (file)
@@ -1180,12 +1180,22 @@ Moves the position of the current instance to the next node in the stream. */
 PHP_METHOD(xmlreader, expand)
 {
 #ifdef HAVE_DOM
-       zval *id, *rv = NULL;
+       zval *id, *rv = NULL, *basenode = NULL;
        int ret;
        xmlreader_object *intern;
        xmlNode *node, *nodec;
+       xmlDocPtr docp = NULL;
+       php_libxml_node_object *domobj = NULL;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|O!", &id, xmlreader_class_entry, &basenode, dom_node_class_entry) == FAILURE) {
+               return;
+       }
+       
+       if (basenode != NULL) {
+               NODE_GET_OBJ(node, basenode, xmlNodePtr, domobj);
+               docp = node->doc;
+       }
 
-       id = getThis();
        intern = (xmlreader_object *)zend_object_store_get_object(id TSRMLS_CC);
 
        if (intern && intern->ptr) {
@@ -1195,12 +1205,12 @@ PHP_METHOD(xmlreader, expand)
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "An Error Occured while expanding");
                        RETURN_FALSE;
                } else {
-                       nodec = xmlCopyNode(node, 1);
+                       nodec = xmlDocCopyNode(node, docp, 1);
                        if (nodec == NULL) {
                                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Cannot expand this node type");
                                RETURN_FALSE;
                        } else {
-                               DOM_RET_OBJ(rv, nodec, &ret, NULL);
+                               DOM_RET_OBJ(rv, nodec, &ret, (dom_object *)domobj);
                        }
                }
        } else {
diff --git a/ext/xmlreader/tests/expand.phpt b/ext/xmlreader/tests/expand.phpt
new file mode 100644 (file)
index 0000000..99c0604
--- /dev/null
@@ -0,0 +1,37 @@
+--TEST--
+XMLReader: Expand into existing DOM documet
+--SKIPIF--
+<?php if (!extension_loaded("xmlreader")) print "skip";
+if (!extension_loaded("dom")) print "skip";
+$reader = new XMLReader();
+if (!method_exists($reader, 'expand')) print "skip";
+?>
+--FILE--
+<?php 
+
+$basexml = '<?xml version="1.0" encoding="UTF-8"?>
+<books><book>base book</book></books>';
+
+$xmlstring = '<?xml version="1.0" encoding="UTF-8"?>
+<books><book>new book</book></books>';
+
+$dom = new DOMDocument();
+$dom->loadXML($basexml);
+
+$reader = new XMLReader();
+$reader->XML($xmlstring);
+while ($reader->read()) {
+    if ($reader->localName == "book") {
+        $node = $reader->expand($dom);
+        if ($node->ownerDocument) {
+            echo $node->ownerDocument->documentElement->firstChild->textContent . "\n";
+        }
+        break;
+    }
+}
+$reader->close();
+?>
+===DONE===
+--EXPECT--
+base book
+===DONE===
\ No newline at end of file