Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg

PHP : Function Reference : XMLReader functions

XMLReader functions


The XMLReader extension is an XML Pull parser. The reader acts as a cursor going forward on the document stream and stopping at each node on the way.


It is important to note that internally, libxml uses the UTF-8 encoding and as such, the encoding of the retrieved contents will always be in UTF-8 encoding.


The XMLReader extension is available in PECL as of PHP 5.0.0 and is included and enabled as of PHP 5.1.0 by default. It can be enabled by adding the argument --enable-xmlreader (or --with-xmlreader before 5.1.0) to your configure line. The libxml extension is required.

Predefined Classes




Table 339. 

Name Type Read-only Description
attributeCount int yes The number of attributes on the node
baseURI string yes The base URI of the node
depth int yes Depth of the node in the tree starting at 0
hasAttributes bool yes Indicates if node has attributes
hasValue bool yes Indicates if node has a text value
isDefault bool yes Indicates if attribute is defaulted from DTD
isEmptyElement bool yes Indicates if node is an empty element tag
localName string yes The local name of the node
name string yes The qualified name of the node
namespaceURI string yes The URI of the namespace associated with the node
nodeType int yes The node type for the node
prefix string yes The prefix of the namespace associated with the node
value string yes The text value of the node
xmlLang string yes The xml:lang scope which the node resides

Predefined Constants

The constants below are defined by this extension, and will only be available when the extension has either been compiled into PHP or dynamically loaded at runtime.


XMLReader uses class constants since PHP 5.1. Prior releases use global constants in the form XMLREADER_ELEMENT.

Table 340. XMLReader Node Types

Constant Value Description
XMLReader::NONE (integer) 0 No node type
XMLReader::ELEMENT (integer) 1 Start element
XMLReader::ATTRIBUTE (integer) 2 Attribute node
XMLReader::TEXT (integer) 3 Text node
XMLReader::CDATA (integer) 4 CDATA node
XMLReader::ENTITY_REF (integer) 5 Entity Reference node
XMLReader::ENTITY (integer) 6 Entity Declaration node
XMLReader::PI (integer) 7 Processing Instruction node
XMLReader::COMMENT (integer) 8 Comment node
XMLReader::DOC (integer) 9 Document node
XMLReader::DOC_TYPE (integer) 10 Document Type node
XMLReader::DOC_FRAGMENT (integer) 11 Document Fragment node
XMLReader::NOTATION (integer) 12 Notation node
XMLReader::WHITESPACE (integer) 13 Whitespace node
XMLReader::SIGNIFICANT_WHITESPACE (integer) 14 Significant Whitespace node
XMLReader::END_ELEMENT (integer) 15 End Element
XMLReader::END_ENTITY (integer) 16 End Entity
XMLReader::XML_DECLARATION (integer) 17 XML Declaration node

Table 341. XMLReader Parser Options

Constant Value Description
XMLReader::LOADDTD (integer) 1 Load DTD but do not validate
XMLReader::DEFAULTATTRS (integer) 2 Load DTD and default attributes but do not validate
XMLReader::VALIDATE (integer) 3 Load DTD and validate while parsing
XMLReader::SUBST_ENTITIES (integer) 4 Substitute entities and expand references

Table of Contents

XMLReader::close — Close the XMLReader input
XMLReader::expand — Returns a copy of the current node as a DOM object
XMLReader::getAttribute — Get the value of a named attribute
XMLReader::getAttributeNo — Get the value of an attribute by index
XMLReader::getAttributeNs — Get the value of an attribute by localname and URI
XMLReader::getParserProperty — Indicates if specified property has been set
XMLReader::isValid — Indicates if the parsed document is valid
XMLReader::lookupNamespace — Lookup namespace for a prefix
XMLReader::moveToAttribute — Move cursor to a named attribute
XMLReader::moveToAttributeNo — Move cursor to an attribute by index
XMLReader::moveToAttributeNs — Move cursor to a named attribute
XMLReader::moveToElement — Position cursor on the parent Element of current Attribute
XMLReader::moveToFirstAttribute — Position cursor on the first Attribute
XMLReader::moveToNextAttribute — Position cursor on the next Attribute
XMLReader::next — Move cursor to next node skipping all subtrees
XMLReader::open — Set the URI containing the XML to parse
XMLReader::read — Move to next node in document
XMLReader::setParserProperty — Set or Unset parser options
XMLReader::setRelaxNGSchema — Set the filename or URI for a RelaxNG Schema
XMLReader::setRelaxNGSchemaSource — Set the data containing a RelaxNG Schema
XMLReader::XML — Set the data containing the XML to parse

Code Examples / Notes » ref.xmlreader


Some more documentation (i.e. examples) would be nice :-)
This is how I read some mysql parameters in an xml file:
$xml = new XMLReader();
$xml->setParserProperty(2,true); // This seems a little unclear to me - but it worked :)
while ($xml->read()) {
switch ($xml->name) {
case "mysql_host":
$conf["mysql_host"] = $xml->value;
case "mysql_username":
$conf["mysql_user"] = $xml->value;
case "mysql_password":
$conf["mysql_pass"] = $xml->value;
case "mysql_database":
$conf["mysql_db"] = $xml->value;
The XML file used:
<?xml version='1.0'?>

ariel gonzalez

Simple function I used while playing around with XMLReader.
function dump_xmlreader($o) {
$node_types = array (
0=>"No node type",
1=>"Start element",
2=>"Attribute node",
3=>"Text node",
4=>"CDATA node",
5=>"Entity Reference node",
6=>"Entity Declaration node",
7=>"Processing Instruction node",
8=>"Comment node",
9=>"Document node",
10=>"Document Type node",
11=>"Document Fragment node",
12=>"Notation node",
13=>"Whitespace node",
14=>"Significant Whitespace node",
15=>"End Element",
16=>"End Entity",
17=>"XML Declaration node"
echo "attributeCount = " . $o->attributeCount . "\n";
echo "baseURI = " . $o->baseURI . "\n";
echo "depth = " . $o->depth . "\n";
echo "hasAttributes = " . ( $o->hasAttributes ? 'TRUE' : 'FALSE' ) . "\n";
echo "hasValue = " . ( $o->hasValue ? 'TRUE' : 'FALSE' ) . "\n";
echo "isDefault = " . ( $o->isDefault ? 'TRUE' : 'FALSE' ) . "\n";
echo "isEmptyElement = " . ( @$o->isEmptyElement ? 'TRUE' : 'FALSE' ) . "\n";
echo "localName = " . $o->localName . "\n";
echo "name = " . $o->name . "\n";
echo "namespaceURI = " . $o->namespaceURI . "\n";
echo "nodeType = " . $o->nodeType . ' - ' . $node_types[$o->nodeType] . "\n";
echo "prefix = " . $o->prefix . "\n";
echo "value = " . $o->value . "\n";
echo "xmlLang = " . $o->xmlLang . "\n";


I found it a little hard to parse nested elements, so wrote a function simplifies it (based off
function read_mixed_xml($filename, $arrayBeginElem, $arrayEndElem)
$output = "";
$arrayBeginKeys = array_keys($arrayBeginElem);
$lengthBegin = count($arrayBeginElem); // Length of the begin array
$arrayEndKeys = array_keys($arrayEndElem);
$lengthEnd = count($arrayEndElem); // Length of end element array
$xmlReader = new XMLReader();
$xmlReader->read(); // Skip root node
/* Go through the nodes */
 /* We're only parsing begin and #text nodes right now */
 if($xmlReader->nodeType != XMLReader::END_ELEMENT)
   /* If the current node is a begin element, go through the array of begin elements, in search of the current node's name. If it is, append $arrayBeginElem's value for the current node's name to the $output. (Simulates case "paragraph":
$output .= "

) */
   case XMLReader::ELEMENT:
    for($i = 0; $i < $lengthBegin; $i++)
      $key = $arrayBeginKeys[i];
       $output .= $arrayBeginElem[$key];
 /* If the current node is a #text node, append the node's value to $output */
   case XMLReader::TEXT:
    $output .= $xmlReader->value;
 /* If the current node is an end element, go through the array of end elements, and search for the current node's name. If found, append $arrayEndElem's value for the current node's name to the output */
 else if($xmlReader->nodeType == XMLReader::END_ELEMENT)
   for($i = 0; $i < $lengthEnd; $i++)
     $key = $arrayEndKeys[i];
      $output .= $arrayEndElem[$key];
return $output;
Example input:
$begin = array("title" => "   <h1>", "paragraph" => "  

", "italicized" => "<i>");
$end = array("title" => "</h1>", "paragraph" => "", "italicized" => "</i>");
$content = read_mixed_xml("index.xml", $begin, $end);
echo $content;
<?xml version="1.0"?>
Lorem <italicized>ipsum dolor sit amet</italicized>, consectetuer adipiscing elit. Donec neque augue, nonummy sit amet, interdum vitae, egestas a, nulla. Aenean sed turpis eget lacus venenatis tincidunt. Integer in leo vitae est euismod congue. Curabitur quis tellus ut nulla pharetra fringilla. Phasellus id risus sagittis turpis lobortis pretium.
Curabitur ultrices pulvinar massa. Nullam ac massa. Morbi adipiscing pharetra est. In non neque vitae massa adipiscing vestibulum. Integer congue, lacus non sagittis consectetuer, magna nisl eleifend nisl, id fringilla justo justo et arcu.
Example output:

Lorem <i>ipsum dolor sit amet</i>, consectetuer adipiscing elit. Donec neque augue, nonummy sit amet, interdum vitae, egestas a, nulla. Aenean sed turpis eget lacus venenatis tincidunt. Integer in leo vitae est euismod congue. Curabitur quis tellus ut nulla pharetra fringilla. Phasellus id risus sagittis turpis lobortis pretium.

Curabitur ultrices pulvinar massa. Nullam ac massa. Morbi adipiscing pharetra est. In non neque vitae massa adipiscing vestibulum. Integer congue, lacus non sagittis consectetuer, magna nisl eleifend nisl, id fringilla justo justo et arcu.


Example, as requested, with nested nodes.
<name>folder A</name>
<name>Afile 1</name>
<name>Afile 2</name>
<name>folder B</name>
<name>Bfile 1</name>
<name>Bfile 2</name>
$xmldata = ob_get_contents();
$xml = new XMLReader();
$data = array();
while ($xml->read())
while($xml->depth<=2 && $xml->nodeType==1)
if ($xml->nodeType==3 && $xml->depth==3) // NodeType 3 : Text Element
$strFolderName = $xml->value;
if ($xml->nodeType==3)
$data[$strFolderName][] = $xml->value;
echo "\n";
Output :
   [folder A] => Array
           [0] => Afile 1
           [1] => Afile 2
   [folder B] => Array
           [0] => Bfile 1
           [1] => Bfile 2


DTD Validation
Parser properties can be set using:
 $xml_reader->setParserProperty(XMLReader::CONSTANT_NAME, BoolenValue);
The constant setting in the xmlreader_validatedtd.php example that comes
with the xmlread package results in an error.
Here is how I got it to work...
$indent = 5; /* Number of spaces to indent per level */
$xml = new XMLReader();
// FROM: $xml->setParserProperty(XMLREADER_LOADDTD, TRUE);
$xml->setParserProperty(XMLReader::LOADDTD,  TRUE);
$xml->setParserProperty(XMLReader::VALIDATE, TRUE);
while($xml->read()) {
/* Print node name indenting it based on depth and $indent var */
print str_repeat(" ", $xml->depth * $indent).$xml->name."\n";
if ($xml->hasAttributes) {
$attCount = $xml->attributeCount;
print str_repeat(" ", $xml->depth * $indent)." Number of Attributes: ".$xml->attributeCount."\n";
print "\n\nValid:\n";

Change Language

Follow Navioo On Twitter
.NET Functions
Apache-specific Functions
Alternative PHP Cache
Advanced PHP debugger
Array Functions
Aspell functions [deprecated]
BBCode Functions
BCMath Arbitrary Precision Mathematics Functions
PHP bytecode Compiler
Bzip2 Compression Functions
Calendar Functions
CCVS API Functions [deprecated]
Class/Object Functions
Classkit Functions
ClibPDF Functions [deprecated]
COM and .Net (Windows)
Crack Functions
Character Type Functions
Cybercash Payment Functions
Credit Mutuel CyberMUT functions
Cyrus IMAP administration Functions
Date and Time Functions
DB++ Functions
Database (dbm-style) Abstraction Layer Functions
dBase Functions
DBM Functions [deprecated]
dbx Functions
Direct IO Functions
Directory Functions
DOM Functions
DOM XML Functions
enchant Functions
Error Handling and Logging Functions
Exif Functions
Expect Functions
File Alteration Monitor Functions
Forms Data Format Functions
Fileinfo Functions
filePro Functions
Filesystem Functions
Filter Functions
Firebird/InterBase Functions
Firebird/Interbase Functions (PDO_FIREBIRD)
FriBiDi Functions
FrontBase Functions
FTP Functions
Function Handling Functions
GeoIP Functions
Gettext Functions
GMP Functions
gnupg Functions
Haru PDF Functions
hash Functions
Hyperwave Functions
Hyperwave API Functions
i18n Functions
IBM Functions (PDO_IBM)
iconv Functions
ID3 Functions
IIS Administration Functions
Image Functions
Imagick Image Library
Informix Functions
Informix Functions (PDO_INFORMIX)
Ingres II Functions
IRC Gateway Functions
PHP / Java Integration
JSON Functions
LDAP Functions
libxml Functions
Lotus Notes Functions
LZF Functions
Mail Functions
Mailparse Functions
Mathematical Functions
MaxDB PHP Extension
MCAL Functions
Mcrypt Encryption Functions
MCVE (Monetra) Payment Functions
Memcache Functions
Mhash Functions
Mimetype Functions
Ming functions for Flash
Miscellaneous Functions
mnoGoSearch Functions
Microsoft SQL Server Functions
Microsoft SQL Server and Sybase Functions (PDO_DBLIB)
Mohawk Software Session Handler Functions
mSQL Functions
Multibyte String Functions
muscat Functions
MySQL Functions
MySQL Functions (PDO_MYSQL)
MySQL Improved Extension
Ncurses Terminal Screen Control Functions
Network Functions
Newt Functions
NSAPI-specific Functions
Object Aggregation/Composition Functions
Object property and method call overloading
Oracle Functions
ODBC Functions (Unified)
ODBC and DB2 Functions (PDO_ODBC)
OpenAL Audio Bindings
OpenSSL Functions
Oracle Functions [deprecated]
Oracle Functions (PDO_OCI)
Output Control Functions
Ovrimos SQL Functions
Paradox File Access
Parsekit Functions
Process Control Functions
Regular Expression Functions (Perl-Compatible)
PDF Functions
PDO Functions
Phar archive stream and classes
PHP Options&Information
POSIX Functions
Regular Expression Functions (POSIX Extended)
PostgreSQL Functions
PostgreSQL Functions (PDO_PGSQL)
Printer Functions
Program Execution Functions
PostScript document creation
Pspell Functions
qtdom Functions
Rar Functions
GNU Readline
GNU Recode Functions
RPM Header Reading Functions
runkit Functions
SAM - Simple Asynchronous Messaging
Satellite CORBA client extension [deprecated]
SCA Functions
SDO Functions
SDO XML Data Access Service Functions
SDO Relational Data Access Service Functions
SESAM Database Functions
PostgreSQL Session Save Handler
Session Handling Functions
Shared Memory Functions
SimpleXML functions
SNMP Functions
SOAP Functions
Socket Functions
Standard PHP Library (SPL) Functions
SQLite Functions
SQLite Functions (PDO_SQLITE)
Secure Shell2 Functions
Statistics Functions
Stream Functions
String Functions
Subversion Functions
Shockwave Flash Functions
Swish Functions
Sybase Functions
TCP Wrappers Functions
Tidy Functions
Tokenizer Functions
Unicode Functions
URL Functions
Variable Handling Functions
Verisign Payflow Pro Functions
vpopmail Functions
W32api Functions
WDDX Functions
win32ps Functions
win32service Functions
xattr Functions
xdiff Functions
XML Parser Functions
XML-RPC Functions
XMLReader functions
XMLWriter Functions
XSL functions
XSLT Functions
YAZ Functions
YP/NIS Functions
Zip File Functions
Zlib Compression Functions
eXTReMe Tracker