PHP Doku:: Load XML from a string - domdocument.loadxml.html

Verlauf / Chronik / History: (1) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzXML-ManipulationDocument Object ModelThe DOMDocument classDOMDocument::loadXML

Ein Service von Reinhard Neidl - Webprogrammierung.

The DOMDocument class

<<DOMDocument::loadHTMLFile

DOMDocument::normalizeDocument>>

DOMDocument::loadXML

(PHP 5)

DOMDocument::loadXML Load XML from a string

Beschreibung

mixed DOMDocument::loadXML ( string $source [, int $options = 0 ] )

Loads an XML document from a string.

Parameter-Liste

source

The string containing the XML.

options

Bitwise OR of the libxml option constants.

Rückgabewerte

Gibt bei Erfolg TRUE zurück. Im Fehlerfall wird FALSE zurückgegeben. If called statically, returns a DOMDocumentIm Fehlerfall wird FALSE zurückgegeben..

Fehler/Exceptions

If an empty string is passed as the source, a warning will be generated. This warning is not generated by libxml and cannot be handled using libxml's error handling functions.

This method may be called statically, but will issue an E_STRICT error.

Beispiele

Beispiel #1 Creating a Document

<?php
$doc 
= new DOMDocument();
$doc->loadXML('<root><node/></root>');
echo 
$doc->saveXML();
?>

Beispiel #2 Static invocation of loadXML

<?php
// Issues an E_STRICT error
$doc DOMDocument::loadXML('<root><node/></root>');
echo 
$doc->saveXML();
?>

Siehe auch


12 BenutzerBeiträge:
- Beiträge aktualisieren...
szalma dot laszlo at zengo dot eu
27.10.2009 17:14
Loading from a string works fine without the <?xml version="1.0" encoding="utf-8"?> header, but in this case the xmlEncoding won't be set, and this makes the utf-8 characters (international, and special characters) to be encoded as hexa entities when saved with saveXML()!
remacg
26.02.2009 16:33
Instead of doing this:

<?php
$str
= <<<XML
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE root [
<!ENTITY nbsp "&#160;">
]>
<div>This&nbsp;is a non-breaking space.</div>
XML;

$dd2 = new DOMDocument();
$dd2->loadXML($str);

echo
$dd2->saveXML();
?>

simply use:

loadHTML() rather than loadXML().
olalonde at NOSPAM dot gmail dot com
22.03.2008 2:00
For some reason, when you set DOMDocument's property 'recover' to true, using '@' to mask errors thrown by loadXml() won't work.

Here's my workaround:

function maskErrors() {}
set_error_handler('maskErrors');
$dom->loadXml($xml);
restore_error_handler();

You could also simply do this: error_reporting(0); and then set back error_reporting to its original state.
Stuart Grimshaw
26.06.2007 22:57
Possible values for the options parameter can be found here:

http://us3.php.net/manual/en/ref.libxml.php#libxml.constants
Marc Liyanage
18.06.2007 16:08
The documentation states that loadXML can be called statically, but this is misleading. This feature seems to be a special case hack and its use seems to be discouraged according to http://bugs.php.net/bug.php?id=41398.

Calling the method statically will fail with an error if the code runs with E_STRICT error reporting enabled.

The documentation should be changed to make it clear that a static call is against recommended practice and won't work with E_STRICT.
gabriel dot birke at web dot de
3.05.2007 17:44
If you want to preserve greater-than and lower-than signs inside CDATA sections with XSL processing you have to use the LIBXML_NOCDATA option:

Given this XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output omit-xml-declaration="yes" />
<xsl:template match="/">
<script type="text/javascript">
<xsl:text disable-output-escaping="yes">
// Decorative Brackets:
<![CDATA[// <<<<>>>> ]]>
</xsl:text>
</script>
</xsl:template>
</xsl:stylesheet>

and this PHP:

<?php

$xml
= new DOMDocument;
$xml->load('dummy.xml');

$xsl1 = new DOMDocument;
$xsl1->load('scripttest.xsl');

$xsl2 = new DOMDocument;
$xsl2->load('scripttest.xsl', LIBXML_NOCDATA);

$proc = new XSLTProcessor;

echo
"Normal Load:\n";
$proc->importStyleSheet($xsl1);
echo
$proc->transformToXML($xml);

echo
"LIBXML_NOCDATA Load:\n";
$proc->importStyleSheet($xsl2);
echo
$proc->transformToXML($xml);

?>

You get the following output:
Normal Load:
<script type="text/javascript">
// Decorative Brackets:
// &lt;&lt;&lt;&lt;&gt;&gt;&gt;&gt;
</script>
LIBXML_NOCDATA Load:
<script type="text/javascript">
// Decorative Brackets:
// <<<<>>>>
</script>
jazzslider at hotmail dot com
30.04.2007 22:14
When using loadXML() to parse a string that contains entity references (e.g., &nbsp;), be sure that those entity references are properly declared through the use of a DOCTYPE declaration; otherwise, loadXML() will not be able to interpret the string.

Example:
<?php
$str
= <<<XML
<?xml version="1.0" encoding="iso-8859-1"?>
<div>This&nbsp;is a non-breaking space.</div>
XML;

$dd1 = new DOMDocument();
$dd1->loadXML($str);

echo
$dd1->saveXML();
?>

Given the above code, PHP will issue a Warning about the entity 'nbsp' not being properly declared.  Also, the call to saveXML() will return nothing but a trimmed-down version of the original processing instruction...everything else is gone, and all because of the undeclared entity.

Instead, explicitly declare the entity first:
<?php
$str
= <<<XML
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE root [
<!ENTITY nbsp "&#160;">
]>
<div>This&nbsp;is a non-breaking space.</div>
XML;

$dd2 = new DOMDocument();
$dd2->loadXML($str);

echo
$dd2->saveXML();
?>

Since the 'nbsp' entity is defined in the DOCTYPE, PHP no longer issues that Warning; the string is now well-formed, and loadXML() understands it perfectly.

You can also use references to external DTDs in the same way (e.g., <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">), which is particularly important if you need to do this for many different documents with many different possible entities.

Also, as a sidenote...entity references created by createEntityReference() do not need this kind of explicit declaration.
shaoyu73 at gmail dot com
16.03.2007 5:53
earth at anonymous dot com,

preserveWhiteSpace property needs to be set to false for formatOutput to work properly, for some reason.

$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->loadXML($xmlStr);
...
$element->appendChild(...);
...
$dom->formatOutput = true;
$xmlStr = $dom->saveXML();
echo $xmlStr;

This would format the output nicely.
Gavin Sinai gsinai at gmx dot net
30.08.2006 16:34
loadXml reports an error instead of throwing an exception when the xml is not well formed. This is annoying if you are trying to to loadXml() in a try...catch statement. Apparently its a feature, not a bug, because this conforms to a spefication.

If you want to catch an exception instead of generating a report, you could do something like

<?php
function HandleXmlError($errno, $errstr, $errfile, $errline)
{
    if (
$errno==E_WARNING && (substr_count($errstr,"DOMDocument::loadXML()")>0))
    {
        throw new
DOMException($errstr);
    }
    else
        return
false;
}

function
XmlLoader($strXml)
{
   
set_error_handler('HandleXmlError');
   
$dom = new DOMDocument();
   
$dom->loadXml($strXml);   
   
restore_error_handler();
    return
$dom;
 }

?>

Returning false in function HandleXmlError() causes a fallback to the default error handler.
mp at webfactory dot de
8.08.2006 17:26
While loadXML() expects its input to have a leading XML processing instruction to deduce the encoding used, there's no such concept in (non-XML) HTML documents. Thus, the libxml library underlying the DOM functions peeks at the <META> tags to figure out the encoding used.

See http://xmlsoft.org/encoding.html.
earth at anonymous dot com
12.04.2006 11:28
Note that loadXML crops off beginning and trailing whitespace and linebreaks.

When using loadXML and appendChild to add a chunk of XML to an existing document, you may want to force a linebreak between the end of the XML chunk and the next line (usually a close tag) in the output file:

$childDocument = new DOMDocument;
$childDocument>preserveWhiteSpace = true;
$childDocument->loadXML(..XML-Chunk..);
$mNewNode = $mainDOcument->importNode($childDocument->documentElement, true);
$ParentNode->appendChild($mNewNode);
$ParentNode->appendChild($mainDocument->createTextNode("\\n  ");

Although it is said that DOM should not be used to make 'pretty' XML output, it is something I struggled with to get something that was readable for testing.  Another solution is to use the createDocumentFragment()->appendXML(..XML-Chunk..) instead, which seems not to trim off linebreaks like DOMDocument->loadXML() does.
primaryspace at hotmail dot com
9.08.2005 22:42
This method replaces any existing document tree already in the object with the document tree contained in the source argument.



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)