note 74848 added to function.dom-domdocument-loadxml

From: Date: Mon, 30 Apr 2007 20:14:11 +0000
Subject: note 74848 added to function.dom-domdocument-loadxml
Groups: php.notes 
Request: Send a blank email to php-notes+get-125994@lists.php.net to get a copy of this message
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. ---- Server IP: 69.39.81.135 Probable Submitter: 129.120.182.237 ---- Manual Page -- http://www.php.net/manual/en/function.dom-domdocument-loadxml.php Edit -- https://master.php.net/note/edit/74848 Del: integrated -- https://master.php.net/note/delete/74848/integrated Del: useless -- https://master.php.net/note/delete/74848/useless Del: bad code -- https://master.php.net/note/delete/74848/bad+code Del: spam -- https://master.php.net/note/delete/74848/spam Del: non-english -- https://master.php.net/note/delete/74848/non-english Del: in docs -- https://master.php.net/note/delete/74848/in+docs Del: other reasons-- https://master.php.net/note/delete/74848 Reject -- https://master.php.net/note/reject/74848 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#125994) next »