summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Watkins <krakjoe@php.net>2017-01-28 08:27:33 +0000
committerJoe Watkins <krakjoe@php.net>2017-01-28 08:27:53 +0000
commit366f83848323cac22dedf76597060138b80b95fd (patch)
treec9bd34ef6daf8e3954f49dd554816bea94a70837
parent19fff2ece61c143278d01a9ed136969b592f6280 (diff)
parent2fcf1259c6a9c1d70bcdfb96aeabc54c47e2a4a0 (diff)
downloadphp-git-366f83848323cac22dedf76597060138b80b95fd.tar.gz
Merge branch 'PHP-7.0' into PHP-7.1
* PHP-7.0: fixed bug #50989 (DOM support for LIBXML_NOXMLDECL)
-rw-r--r--NEWS1
-rw-r--r--ext/dom/document.c51
-rw-r--r--ext/dom/tests/bug50989.phpt12
3 files changed, 35 insertions, 29 deletions
diff --git a/NEWS b/NEWS
index 9894f76c46..6e075daa57 100644
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,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)
diff --git a/ext/dom/document.c b/ext/dom/document.c
index 18d652064e..0086d13c41 100644
--- a/ext/dom/document.c
+++ b/ext/dom/document.c
@@ -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
index 0000000000..1ef554ac3e
--- /dev/null
+++ b/ext/dom/tests/bug50989.phpt
@@ -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