rrichards               Wed Jan  7 10:33:26 2004 EDT

  Modified files:              
    /php-src/ext/dom    document.c 
    /php-src/ext/dom/tests      dom_xinclude.phpt 
  Log:
  Fix bug #26815 (foreach (DOM) childnodes causes error using Xinclude)
  update xinclude test
  
Index: php-src/ext/dom/document.c
diff -u php-src/ext/dom/document.c:1.41 php-src/ext/dom/document.c:1.42
--- php-src/ext/dom/document.c:1.41     Sun Dec 21 13:22:14 2003
+++ php-src/ext/dom/document.c  Wed Jan  7 10:33:24 2004
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: document.c,v 1.41 2003/12/21 18:22:14 iliaa Exp $ */
+/* $Id: document.c,v 1.42 2004/01/07 15:33:24 rrichards Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -1441,19 +1441,65 @@
 }
 /* }}} end dom_document_savexml */
 
+static xmlNodePtr php_dom_free_xinclude_node(xmlNodePtr cur TSRMLS_DC) {
+       xmlNodePtr xincnode;
+
+       xincnode = cur;
+       cur = cur->next;
+       xmlUnlinkNode(xincnode);
+       php_libxml_node_free_resource(xincnode TSRMLS_CC);
+
+       return cur;
+}
+
+static void php_dom_remove_xinclude_nodes(xmlNodePtr cur TSRMLS_DC) {
+       while(cur) {
+               if (cur->type == XML_XINCLUDE_START) {
+                       cur = php_dom_free_xinclude_node(cur TSRMLS_CC);
+
+                       /* XML_XINCLUDE_END node will be a sibling of 
XML_XINCLUDE_START */
+                       while(cur && cur->type != XML_XINCLUDE_END) {
+                               cur = cur->next;
+                       }
+
+                       if (cur && cur->type == XML_XINCLUDE_END) {
+                               cur = php_dom_free_xinclude_node(cur TSRMLS_CC);
+                       }
+               } else {
+                       if (cur->type == XML_ELEMENT_NODE) {
+                               php_dom_remove_xinclude_nodes(cur->children TSRMLS_CC);
+                       }
+                       cur = cur->next;
+               }
+       }
+}
+
 /* {{{ proto int dom_document_xinclude()
    Substitutues xincludes in a DomDocument */
 PHP_FUNCTION(dom_document_xinclude)
 {
        zval *id;
        xmlDoc *docp;
+       xmlNodePtr root;
        int err; 
        dom_object *intern;
 
        DOM_GET_THIS_OBJ(docp, id, xmlDocPtr, intern);
 
        err = xmlXIncludeProcess (docp);
-       
+
+       /* XML_XINCLUDE_START and XML_XINCLUDE_END nodes need to be removed as these
+       are added via xmlXIncludeProcess to mark beginning and ending of xincluded 
document 
+       but are not wanted in resulting document - must be done even if err as it 
could fail after
+       having processed some xincludes */
+       root = (xmlNodePtr) docp->children;
+       while(root && root->type != XML_ELEMENT_NODE && root->type != 
XML_XINCLUDE_START) {
+               root = root->next;
+       }
+       if (root) {
+               php_dom_remove_xinclude_nodes(root TSRMLS_CC);
+       }
+
        if (err) {
                RETVAL_LONG(err);
        } else {
Index: php-src/ext/dom/tests/dom_xinclude.phpt
diff -u php-src/ext/dom/tests/dom_xinclude.phpt:1.2 
php-src/ext/dom/tests/dom_xinclude.phpt:1.3
--- php-src/ext/dom/tests/dom_xinclude.phpt:1.2 Fri Oct 31 11:12:27 2003
+++ php-src/ext/dom/tests/dom_xinclude.phpt     Wed Jan  7 10:33:25 2004
@@ -10,7 +10,10 @@
 $dom = new domdocument;
 $dom->load(dirname(__FILE__)."/xinclude.xml");
 $dom->xinclude();
-print $dom->saveXML();
+print $dom->saveXML()."\n";
+foreach ($dom->documentElement->childNodes as $node) {
+       print $node->nodeName."\n";
+}
 
 --EXPECT--
 <?xml version="1.0"?>
@@ -23,3 +26,8 @@
   <author>John Steinbeck</author>
  </book>
  </foo>
+
+#text
+book
+book
+#text

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to