]> granicus.if.org Git - php/commitdiff
fixed bug #50989 (DOM support for LIBXML_NOXMLDECL)
authorjhdxr <jhdxr@php.net>
Sat, 28 Jan 2017 06:56:03 +0000 (14:56 +0800)
committerJoe Watkins <krakjoe@php.net>
Sat, 28 Jan 2017 08:27:05 +0000 (08:27 +0000)
NEWS
ext/dom/document.c
ext/dom/tests/bug50989.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index b0566a9ccc11a1ee7e132d810009245d8ed3143d..132a7fe677516025b9b93f08fa096eed908cea9f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,7 @@ PHP                                                                        NEWS
 - DOM:
   . Fixed bug #54382 (getAttributeNodeNS doesn't get xmlns* attributes).
     (aboks)
+  . Fixed bug #50989 (support for LIBXML_NOXMLDECL). (jhdxr)
 
 - DTrace:
   . Fixed bug #73965 (DTrace reported as enabled when disabled). (Remi)
index cab0aa55ce43a8d1983741b407e7232add83e5cc..c7e4f8e7a5307997e9c7bc3d9926b05846ff86ea 100644 (file)
@@ -26,6 +26,7 @@
 #include "php.h"
 #if HAVE_LIBXML && HAVE_DOM
 #include "php_dom.h"
+#include <libxml/xmlsave.h>
 #include <libxml/SAX.h>
 #ifdef LIBXML_SCHEMAS_ENABLED
 #include <libxml/relaxng.h>
@@ -1616,59 +1617,51 @@ PHP_FUNCTION(dom_document_savexml)
        dom_doc_propsptr doc_props;
        int size, format, saveempty = 0;
        zend_long options = 0;
+       xmlSaveCtxtPtr xscp;
 
        if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O|O!l", &id, dom_document_class_entry, &nodep, dom_node_class_entry, &options) == FAILURE) {
                return;
        }
+       options = options | XML_SAVE_AS_XML;
 
        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
 
        doc_props = dom_get_doc_props(intern->document);
        format = doc_props->formatoutput;
 
+       buf = xmlBufferCreate();
+       if (!buf) {
+               php_error_docref(NULL, E_WARNING, "Could not fetch buffer");
+               RETURN_FALSE;
+       }
+       xscp = xmlSaveToBuffer(buf, docp->encoding, options);
+       
        if (nodep != NULL) {
                /* Dump contents of Node */
                DOM_GET_OBJ(node, nodep, xmlNodePtr, nodeobj);
                if (node->doc != docp) {
                        php_dom_throw_error(WRONG_DOCUMENT_ERR, dom_get_strict_error(intern->document));
+                       xmlBufferFree(buf);
                        RETURN_FALSE;
                }
-               buf = xmlBufferCreate();
-               if (!buf) {
-                       php_error_docref(NULL, E_WARNING, "Could not fetch buffer");
-                       RETURN_FALSE;
-               }
-               if (options & LIBXML_SAVE_NOEMPTYTAG) {
-                       saveempty = xmlSaveNoEmptyTags;
-                       xmlSaveNoEmptyTags = 1;
-               }
-               xmlNodeDump(buf, docp, node, 0, format);
-               if (options & LIBXML_SAVE_NOEMPTYTAG) {
-                       xmlSaveNoEmptyTags = saveempty;
-               }
-               mem = (xmlChar*) xmlBufferContent(buf);
-               if (!mem) {
+               if(xmlSaveTree(xscp, node) < 0) {
                        xmlBufferFree(buf);
                        RETURN_FALSE;
                }
-               RETVAL_STRING((char *) mem);
-               xmlBufferFree(buf);
        } else {
-               if (options & LIBXML_SAVE_NOEMPTYTAG) {
-                       saveempty = xmlSaveNoEmptyTags;
-                       xmlSaveNoEmptyTags = 1;
-               }
-               /* Encoding is handled from the encoding property set on the document */
-               xmlDocDumpFormatMemory(docp, &mem, &size, format);
-               if (options & LIBXML_SAVE_NOEMPTYTAG) {
-                       xmlSaveNoEmptyTags = saveempty;
-               }
-               if (!size || !mem) {
+               if(xmlSaveDoc(xscp, docp) < 0) {
+                       xmlBufferFree(buf);
                        RETURN_FALSE;
                }
-               RETVAL_STRINGL((char *) mem, size);
-               xmlFree(mem);
        }
+       xmlSaveClose(xscp);
+       mem = (xmlChar*) xmlBufferContent(buf);
+       if (!mem) {
+               xmlBufferFree(buf);
+               RETURN_FALSE;
+       }
+       RETVAL_STRING((char *) mem);
+       xmlBufferFree(buf);
 }
 /* }}} end dom_document_savexml */
 
diff --git a/ext/dom/tests/bug50989.phpt b/ext/dom/tests/bug50989.phpt
new file mode 100644 (file)
index 0000000..1ef554a
--- /dev/null
@@ -0,0 +1,12 @@
+--TEST--
+Bug #50989  add support LIBXML_NOXMLDECL  for DOMDocument::saveXML()
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+$dom = new DomDocument();
+$dom->loadXML("<foo />");
+
+print $dom->saveXML(null,LIBXML_NOXMLDECL);
+--EXPECT--
+<foo/>
\ No newline at end of file