PHP
downloads | documentation | faq | getting help | mailing lists | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

XMLReader::close> <XMLReader
Last updated: Fri, 14 Nov 2008

view this page in

The XMLReader class

Introduction

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.

Class synopsis

XMLReader
XMLReader {
/* Constants */
const int XMLReader::NONE =0 ;
const int XMLReader::ELEMENT =1 ;
const int XMLReader::ATTRIBUTE =2 ;
const int XMLReader::TEXT =3 ;
const int XMLReader::CDATA =4 ;
const int XMLReader::ENTITY_REF =5 ;
const int XMLReader::ENTITY =6 ;
const int XMLReader::PI =7 ;
const int XMLReader::COMMENT =8 ;
const int XMLReader::DOC =9 ;
const int XMLReader::DOC_TYPE =10 ;
const int XMLReader::DOC_FRAGMENT =11 ;
const int XMLReader::NOTATION =12 ;
const int XMLReader::WHITESPACE =13 ;
const int XMLReader::END_ELEMENT =15 ;
const int XMLReader::END_ENTITY =16 ;
const int XMLReader::LOADDTD =1 ;
const int XMLReader::DEFAULTATTRS =2 ;
const int XMLReader::VALIDATE =3 ;
/* Properties */
public readonly int $attributeCount ;
public readonly string $baseURI ;
public readonly int $depth ;
public readonly bool $hasAttributes ;
public readonly bool $hasValue ;
public readonly bool $isDefault ;
public readonly bool $isEmptyElement ;
public readonly string $localName ;
public readonly string $name ;
public readonly string $namespaceURI ;
public readonly int $nodeType ;
public readonly string $prefix ;
public readonly string $value ;
public readonly string $xmlLang ;
/* Methods */
bool XMLReader::close ( void )
DOMNode XMLReader::expand ( void )
string XMLReader::getAttribute ( string $name )
string XMLReader::getAttributeNo ( int $index )
string XMLReader::getAttributeNs ( string $localName , string $namespaceURI )
bool XMLReader::getParserProperty ( int $property )
bool XMLReader::isValid ( void )
bool XMLReader::lookupNamespace ( string $prefix )
bool XMLReader::moveToAttribute ( string $name )
bool XMLReader::moveToAttributeNo ( int $index )
bool XMLReader::moveToAttributeNs ( string $localName , string $namespaceURI )
bool XMLReader::next ([ string $localname ] )
bool XMLReader::open ( string $URI [, string $encoding [, int $options ]] )
bool XMLReader::read ( void )
string XMLReader::readInnerXML ( void )
string XMLReader::readOuterXML ( void )
string XMLReader::readString ( void )
bool XMLReader::setParserProperty ( int $property , bool $value )
bool XMLReader::setRelaxNGSchema ( string $filename )
bool XMLReader::setRelaxNGSchemaSource ( string $source )
bool XMLReader::setSchema ( string $filename )
bool XMLReader::xml ( string $source [, string $encoding [, int $options ]] )
}

Properties

attributeCount

The number of attributes on the node

baseURI

The base URI of the node

depth

Depth of the node in the tree, starting at 0

hasAttributes

Indicates if node has attributes

hasValue

Indicates if node has a text value

isDefault

Indicates if attribute is defaulted from DTD

isEmptyElement

Indicates if node is an empty element tag

localName

The local name of the node

name

The qualified name of the node

namespaceURI

The URI of the namespace associated with the node

nodeType

The node type for the node

prefix

The prefix of the namespace associated with thenode

value

The text value of the node

xmlLang

The xml:lang scope which the node resides

Predefined Constants

XMLReader Node Types

XMLReader::NONE

No node type

XMLReader::ELEMENT

Start element

XMLReader::ATTRIBUTE

Attribute node

XMLReader::TEXT

Text node

XMLReader::CDATA

CDATA node

XMLReader::ENTITY_REF

Entity Reference node

XMLReader::ENTITY

Entity Declaration node

XMLReader::PI

Processing Instruction node

XMLReader::COMMENT

Comment node

XMLReader::DOC

Document node

XMLReader::DOC_TYPE

Document Type node

XMLReader::DOC_FRAGMENT

Document Fragment node

XMLReader::NOTATION

Notation node

XMLReader::WHITESPACE

Whitespace node

XMLReader::SIGNIFICANT_WHITESPACE

Significant Whitespace node

XMLReader::END_ELEMENT

End Element

XMLReader::END_ENTITY

End Entity

XMLReader::XML_DECLARATION

XML Declaration node

XMLReader Parser Options

XMLReader::LOADDTD

Load DTD but do not validate

XMLReader::DEFAULTATTRS

Load DTD and default attributes but do not validate

XMLReader::VALIDATE

Load DTD and validate while parsing

XMLReader::SUBST_ENTITIES

Substitute entities and expand references

Table of Contents



XMLReader::close> <XMLReader
Last updated: Fri, 14 Nov 2008
 
add a note add a note User Contributed Notes
XMLReader
Alex "wired" Alexander
12-Nov-2008 10:32
There is a bug in the previous author's function. If a tag without children contains both attributes and a value, the function skips the attributes.

-- Editor's note: The previsou author was godseth at o2 dot pl. His note was removed. --

Here's an improved version that keeps both:

<?php

$xml
= new XMLReader();

function
parseXml($xml) {
     
$assoc = null;
     
$dc = -1;
      while(
$xml->read()){
        switch (
$xml->nodeType) {
          case
XMLReader::END_ELEMENT: return $assoc;
          case
XMLReader::ELEMENT:
              if(!isset(
$assoc[$xml->name])) {
                  if(
$xml->hasAttributes) {
                     
$assoc[$xml->name][] = $xml->isEmptyElement ? '' : parseXml($xml);
                  } else {
                      if(
$xml->isEmptyElement) {
                         
$assoc[$xml->name] = '';
                      } else {
                         
$assoc[$xml->name] = parseXml($xml);
                      }
                  }
              } elseif (
is_array($assoc[$xml->name])) {
                  if(
$xml->hasAttributes) {
                     
$assoc[$xml->name][] = $xml->isEmptyElement ? '' : parseXml($xml);
                  } else {
                      if(
$xml->isEmptyElement) {
                         
$assoc[$xml->name][] = '';
                      } else {
                         
$assoc[$xml->name][] = parseXml($xml);
                      }
                  }
              } else {
                 
$mOldVar = $assoc[$xml->name];
                 
$assoc[$xml->name] = array($mOldVar);
                  if(
$xml->hasAttributes) {
                     
$assoc[$xml->name][] = $xml->isEmptyElement ? '' : parseXml($xml);
                  } else {
                      if(
$xml->isEmptyElement) {
                         
$assoc[$xml->name][] = '';
                      } else {
                         
$assoc[$xml->name][] = parseXml($xml);
                      }
                  }
              }

            if(
$xml->hasAttributes){
             
$el =& $assoc[$xml->name][count($assoc[$xml->name]) - 1];
              while(
$xml->moveToNextAttribute()) {
                 
$el[$xml->name] = $xml->value;
              }
            }
            break;
           case
XMLReader::TEXT:
           case
XMLReader::CDATA:
          
//$assoc .= $xml->value;
          
$assoc[++$dc] = $xml->value;
        }
      }
      return
$assoc;
    }
?>
Sergey Aikinkulov
19-Jun-2008 12:51
Next version xml2assoc with some improve fixes:
 - no doubled data
 - no buffer arrays

<?php
/*
    Read XML structure to associative array
    --
    Using:
    $xml = new XMLReader();
    $xml->open([XML file]);
    $assoc = xml2assoc($xml);
    $xml->close();
*/
   
function xml2assoc($xml) {
     
$assoc = null;
      while(
$xml->read()){
        switch (
$xml->nodeType) {
          case
XMLReader::END_ELEMENT: return $assoc;
          case
XMLReader::ELEMENT:
           
$assoc[$xml->name][] = array('value' => $xml->isEmptyElement ? '' : xml2assoc($xml));
            if(
$xml->hasAttributes){
             
$el =& $assoc[$xml->name][count($assoc[$xml->name]) - 1];
              while(
$xml->moveToNextAttribute()) $el['attributes'][$xml->name] = $xml->value;
            }
            break;
          case
XMLReader::TEXT:
          case
XMLReader::CDATA: $assoc .= $xml->value;
        }
      }
      return
$assoc;
    }
?>
desk_ocean at msn dot com
16-Mar-2008 07:03
make some modify from Sergey Aikinkulov's note

<?php
function xml2assoc(&$xml){
   
$assoc = NULL;
   
$n = 0;
    while(
$xml->read()){
        if(
$xml->nodeType == XMLReader::END_ELEMENT) break;
        if(
$xml->nodeType == XMLReader::ELEMENT and !$xml->isEmptyElement){
           
$assoc[$n]['name'] = $xml->name;
            if(
$xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value;
           
$assoc[$n]['val'] = xml2assoc($xml);
           
$n++;
        }
        else if(
$xml->isEmptyElement){
           
$assoc[$n]['name'] = $xml->name;
            if(
$xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value;
           
$assoc[$n]['val'] = "";
           
$n++;               
        }
        else if(
$xml->nodeType == XMLReader::TEXT) $assoc = $xml->value;
    }
    return
$assoc;
}
?>

add else if($xml->isEmptyElement)
may be some xml has emptyelement
itari
15-Feb-2008 05:30
<?php
function parseXML($node,$seq,$path) {
global
$oldpath;
    if (!
$node->read())
      return;
    if (
$node->nodeType != 15) {
      print
'<br/>'.$node->depth;
      print
'-'.$seq++;
      print
'  '.$path.'/'.($node->nodeType==3?'text() = ':$node->name);
      print
$node->value;
      if (
$node->hasAttributes) {
        print
' [hasAttributes: ';
        while (
$node->moveToNextAttribute()) print '@'.$node->name.' = '.$node->value.' ';
        print
']';
        }
      if (
$node->nodeType == 1) {
       
$oldpath=$path;
       
$path.='/'.$node->name;
        }
     
parseXML($node,$seq,$path);
      }
    else
parseXML($node,$seq,$oldpath);
}

$source = "<tag1>this<tag2 id='4' name='foo'>is</tag2>a<tag2 id='5'>common</tag2>record</tag1>";
$xml = new XMLReader();
$xml->XML($source);
print
htmlspecialchars($source).'<br/>';
parseXML($xml,0,'');
?>

Output:

<tag1>this<tag2 id='4' name='foo'>is</tag2>a<tag2 id='5'>common</tag2>record</tag1>

0-0 /tag1
1-1 /tag1/text() = this
1-2 /tag1/tag2 [hasAttributes: @id = 4 @name = foo ]
2-3 /tag1/text() = is
1-4 /text() = a
1-5 /tag2 [hasAttributes: @id = 5 ]
2-6 /text() = common
1-7 /text() = record
orion at ftf-hq dot dk
15-Feb-2006 01:50
Some more documentation (i.e. examples) would be nice :-)

This is how I read some mysql parameters in an xml file:

<?php
    $xml
= new XMLReader();
   
$xml->open("config.xml");
   
$xml->setParserProperty(2,true); // This seems a little unclear to me - but it worked :)

   
while ($xml->read()) {
        switch (
$xml->name) {
        case
"mysql_host":
           
$xml->read();
           
$conf["mysql_host"] = $xml->value;
           
$xml->read();
            break;
        case
"mysql_username":
           
$xml->read();
           
$conf["mysql_user"] = $xml->value;
           
$xml->read();
            break;
        case
"mysql_password":
           
$xml->read();
           
$conf["mysql_pass"] = $xml->value;
           
$xml->read();
            break;
        case
"mysql_database":
           
$xml->read();
           
$conf["mysql_db"] = $xml->value;
           
$xml->read();
            break;
        }
    }

   
$xml->close();
?>

The XML file used:
<?xml version='1.0'?>
<MySQL_INIT>
   <mysql_host>localhost</mysql_host>
   <mysql_database>db_database</mysql_database>
   <mysql_username>root</mysql_username>
   <mysql_password>password</mysql_password>
</MySQL_INIT>

XMLReader::close> <XMLReader
Last updated: Fri, 14 Nov 2008
 
 
show source | credits | sitemap | contact | advertising | mirror sites