DOMDocument->saveXML()

(no version information, might be only in CVS)

DOMDocument->saveXML() --  Dumps the internal XML tree back into a string

说明

class DOMDocument {

string saveXML ( [DOMNode node [, integer options]] )

}

Creates an XML document from the DOM representation. This function is usually called after building a new dom document from scratch as in the example below.

参数

node

Use this parameter to output only a specific node without XML declaration rather than the entire document.

options

Additional Options. Currently only LIBXML_NOEMPTYTAG is supported.

返回值

Returns the XML, or FALSE if an error occurred.

异常

DOM_WRONG_DOCUMENT_ERR

Raised if node is from another document.

更新日志

版本说明
5.1.0 Added the options parameter

范例

例子 1. Saving a DOM tree into a string

<?php

$doc
= new DOMDocument('1.0');
// we want a nice output
$doc->formatOutput = true;

$root = $doc->createElement('book');
$root = $doc->appendChild($root);

$title = $doc->createElement('title');
$title = $root->appendChild($title);

$text = $doc->createTextNode('This is the title');
$text = $title->appendChild($text);

echo
"Retrieving all the document:\n";
echo
$doc->saveXML() . "\n";

echo
"Retrieving only the title part:\n";
echo
$doc->saveXML($title);

?>

上例将输出:

Retrieving all the document:
<?xml version="1.0"?>
<book>
  <title>This is the title</title>
</book>

Retrieving only the title part:
<title>This is the title</title>


add a note add a note User Contributed Notes
devin at SPAMISBAD dot tritarget dot com
15-Aug-2006 01:52
It took some searching to figure this one out. I didn't see much in the way of explaining this glitch in the manual thus far. (For PHP5 I believe)

formatOutput = true; appears to fail when the origin of the DOM came from a file via load(). EX:

<?php
   $dom
= new DOMDocument();
  
$dom->load ("test.xml");
  
$dom->formatOutput = true;

  
$new_tag = $dom->createElement ('testNode');
  
$new_tag->appendChild (
      
$dom->createElement ('test', 'this is a test'));
  
$dom->documentElement->appendChild ($new_tag);

  
printf ("<pre>%s</pre>", htmlentities ($dom->saveXML()));
?>

Will not indent the output and will display the modified nodes all in one long line. Makes for editing a config.xml a bit difficult when saving to a file.

By adding the preserveWhiteSpace = false; BEFORE the load() the formatOutput works as expected. EX:

<?php
   $dom
= new DOMDocument();
  
$dom->preserveWhiteSpace = false;
  
$dom->load ("test.xml");
  
$dom->formatOutput = true;

  
$new_tag = $dom->createElement ('testNode');
  
$new_tag->appendChild (
      
$dom->createElement ('test', 'this is a test'));
  
$dom->documentElement->appendChild ($new_tag);

  
printf ("<pre>%s</pre>", htmlentities ($dom->saveXML()));
?>

CAUTION: If your loaded xml file (test.xml) has an empty root node that is not shortened or has no children this will NOT work.

Example:

DOES NOT WORK:
<?xml version="1.0"?>
<root>
</root>

WORKS:
<?xml version="1.0"?>
<root/>

WORKS:
<?xml version="1.0"?>
<root>
  <!-- comment -->
</root>

WORKS:
<?xml version="1.0"?>
<root>
  <child/>
</root>
27-Mar-2006 08:20
I used the function posted by "joe" but the following works to me for get the innerXML
<?php
$itemLeido
= $XMLRespuesta->getElementsByTagName("articulos");
foreach(
$itemLeido as $node) {
   echo(
$node->ownerDocument->saveXML($node));
}
?>
doc dot php dot net at webdevelopers dot cz
29-Sep-2005 06:25
saveXML() does not produce valid XML in case that the DOM was build using loadHTML() method.

You can experience double attributes (for example double @xmlns attribute on <html> element) or for example two dashes inside the XML comment (<script><!-- for(a=10; a < 10; a--)...; --></script>).

Don't be confused if the result of saveXML() cannot be loaded again with loadXML().

Elixon
mswiercz at mwerk dot com
10-Sep-2004 06:43
Quick tip to minimize memory when generating documents with DOM.

Rather than using
   $xmlStr = DOMDocument->saveXML();
   echo $xmlStr;

to dump a large DOM to the output buffer, use a PHP output stream, as in

   DOMDocument->save('php://output');

A lot of memory will be saved when generating large DOMs.
padys at tlen dot pl
05-Aug-2004 10:36
When you save whole document:
DOMDocument->saveXML() produces string in encoding defined in property DOMDocument->encoding.

When you save only one node:
DOMDocument->saveXML(DOMNode) produces always string in UTF-8.