XMLReader::read

(PHP 5 >= 5.1.2)

XMLReader::read — Move to next node in document

Описание

bool XMLReader::read ( void )

Moves cursor to the next node in the document.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Коментарии

libxml2 contains much more useful method readString() that will read and return whole text content of element. You can call it after receiving start tag (XMLReader::ELEMENT). You can use this PHP code to emulate this method until PHP will directly call underlying libxml2 implementation.

<?php
class XMLReader2 extends XMLReader
{
  function 
readString()
  {
       
$depth 1;
       
$text "";

        while (
$this->read() && $depth != 0)
        {
            if (
in_array($this->nodeType, array(XMLReader::TEXTXMLReader::CDATAXMLReader::WHITESPACEXMLReader::SIGNIFICANT_WHITESPACE)))
               
$text .= $this->value;
            if (
$this->nodeType == XMLReader::ELEMENT$depth++;
            if (
$this->nodeType == XMLReader::END_ELEMENT$depth--;
        }
        return 
$text;
    }
}
?>

Just use XMLReader2 instead of XMLReader.
2006-02-08 03:01:32
http://php5.kiev.ua/manual/ru/xmlreader.read.html
Автор:
It is interesting to note that this function will stop on closing tags as well.  I have an XML document similar to the following:

<root>
  <columns>
    <column>columnX</column>
    <column>columnY</column>
  </columns>
  <table>
    <row>
      <columnX>38</columnX>
      <columnY>50</columnY>
    </row>
    <row>
      <columnX>82</columnY>
      <columnY>28</columnY>
    </row>
    ...
  </table>
</root>

I need to parse the <columns> object to know what attributes to check for from each <row> node.  Therefore I was doing the following:

<?php
while ($xml->read()) {
  if (
$xml->name === 'column') {
   
//parse column node to into $columns array
 
}
  elseif (
$xml->name === 'row') {
   
//parse row node, using constructed $columns array
 
}
}
?>

This kind of worked in that I ended up with an array of all the data I wanted, but the array I constructed was twice as large as I expected and every other entry was empty.  Took me a while to debug, but finally figured out that checking <?php $xml->name === 'row' ?> matches both <row> and </row>, so the check should really be something more like:

<?php

if ($xml->name === 'row' && $xml->nodeType == XMLReader::ELEMENT) {
 
// parse row node
}

?>

I would have liked to use the next() function instead, but as I needed to parse 2 different subtrees, I couldn't figure out how to find all the columns, reset the pointer, and then find all the rows.
2011-06-27 13:49:37
http://php5.kiev.ua/manual/ru/xmlreader.read.html
Автор:
If like myself you have been turning the interwebz upside down looking for a solution for this issue:
PHP Warning:  XMLReader::read(): /tmp/xml_feed.xml:4183934: parser error : Input is not proper UTF-8, indicate encoding !

For some reason, this warning breaks the execution - is it a fatal error in disguise?

After days of frustration I found it!!!!
tidy -xml -o output.xml -utf8 -f error.log input.xml

You can invoque tidy using exec, It takes several seconds to convert a 250Mb feed, but it worthy the time.

In my case the issue was with latin1 charset, and for some reason I had to pass the xml through tidy 2 times - first time around creates new errors, second time it fixes everything.

I know invalid xml should be fixed by xml creators, but it works differently in the real world.
2014-01-29 14:27:31
http://php5.kiev.ua/manual/ru/xmlreader.read.html
Автор:
> I would have liked to use the next() function instead, but as I needed to parse 2 different subtrees, I couldn't figure out how to find all the columns, reset the pointer, and then find all the rows. 

I just use:

$reader->close();
$reader->open($url);

to reset the pointer.
2015-03-20 11:49:34
http://php5.kiev.ua/manual/ru/xmlreader.read.html
Another approach to the 'also reads closing tags' gotcha:

<?php
$reader 
= new XMLReader();
$reader->open('users.xml');

while (
$reader->read()) {
  if (
$reader->nodeType == XMLReader::END_ELEMENT) {
    continue; 
//skips the rest of the code in this iteration
 
}
 
//do something with desired node type
 
if($reader->name == 'user') {
   
//...
 
}
}
?>
2016-10-13 15:08:29
http://php5.kiev.ua/manual/ru/xmlreader.read.html

    Поддержать сайт на родительском проекте КГБ