diff options
author | jhdxr <jhdxr@php.net> | 2017-01-28 14:56:03 +0800 |
---|---|---|
committer | Joe Watkins <krakjoe@php.net> | 2017-01-28 08:27:05 +0000 |
commit | 2fcf1259c6a9c1d70bcdfb96aeabc54c47e2a4a0 (patch) | |
tree | b3ea23ee4ec5133b9eb0b1d46032bc142a7bb8a7 /ext/dom | |
parent | a3d3f76827c7c26f4cd9cdde967d4ed7cb7889fe (diff) | |
download | php-git-2fcf1259c6a9c1d70bcdfb96aeabc54c47e2a4a0.tar.gz |
fixed bug #50989 (DOM support for LIBXML_NOXMLDECL)
Diffstat (limited to 'ext/dom')
-rw-r--r-- | ext/dom/document.c | 51 | ||||
-rw-r--r-- | ext/dom/tests/bug50989.phpt | 12 |
2 files changed, 34 insertions, 29 deletions
diff --git a/ext/dom/document.c b/ext/dom/document.c index cab0aa55ce..c7e4f8e7a5 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 |