Через Кристиана похоже, что в PHP5 будет реализована быстрая реализация XML Pull , основанная на libxml2 (библиотека XML, стоящая за PHP5).
В конце концов это должно быть опубликовано через PECL (и я думаю, что в ближайшем будущем это будет не то, что вы можете ожидать от вашего общего хоста), но прямо сейчас источник находится на сайте http://cvs.php.net/cvs.php/ pecl / xmlreader / .
По сути, это означает (возможно) более простой способ анализа XML, чем в SAX. Статья Филиппа « Назад к основам: XML в .NET» показывает, как работает XMLReader .NET, и его PHP будет почти таким же.
Основываясь на взгляде на исходный код PHP xmlreader, его использование будет примерно таким;
 // Create the parser  $reader = new XMLReader(); // Load some XML in a string  $reader->XML($xml); // Loop through the contents  while ($reader->read()) {  switch ( $reader->nodeType ) { // Tag start  case XMLREADER_ELEMENT:  echo 'Got opening tag for '.reader->name;  break; // Tag start  case XMLREADER_END_ELEMENT:  echo 'Got closing tag for '.reader->name;  break;  }  } 
  // Create the parser  $reader = new XMLReader(); // Load some XML in a string  $reader->XML($xml); // Loop through the contents  while ($reader->read()) {  switch ( $reader->nodeType ) { // Tag start  case XMLREADER_ELEMENT:  echo 'Got opening tag for '.reader->name;  break; // Tag start  case XMLREADER_END_ELEMENT:  echo 'Got closing tag for '.reader->name;  break;  }  } 
  // Create the parser  $reader = new XMLReader(); // Load some XML in a string  $reader->XML($xml); // Loop through the contents  while ($reader->read()) {  switch ( $reader->nodeType ) { // Tag start  case XMLREADER_ELEMENT:  echo 'Got opening tag for '.reader->name;  break; // Tag start  case XMLREADER_END_ELEMENT:  echo 'Got closing tag for '.reader->name;  break;  }  } 
  // Create the parser  $reader = new XMLReader(); // Load some XML in a string  $reader->XML($xml); // Loop through the contents  while ($reader->read()) {  switch ( $reader->nodeType ) { // Tag start  case XMLREADER_ELEMENT:  echo 'Got opening tag for '.reader->name;  break; // Tag start  case XMLREADER_END_ELEMENT:  echo 'Got closing tag for '.reader->name;  break;  }  } 
  // Create the parser  $reader = new XMLReader(); // Load some XML in a string  $reader->XML($xml); // Loop through the contents  while ($reader->read()) {  switch ( $reader->nodeType ) { // Tag start  case XMLREADER_ELEMENT:  echo 'Got opening tag for '.reader->name;  break; // Tag start  case XMLREADER_END_ELEMENT:  echo 'Got closing tag for '.reader->name;  break;  }  } 
Другими словами, вместо обратных вызовов SAX вы можете обрабатывать весь документ в одном цикле — отлично подходит для взлома!
Также интересно, что согласно оригинальным примерам C на xmlreader , он имеет возможность проверять XML на соответствие DTD или схеме Relax NG. Сейчас я считаю, что последние расширения DOM могут проверять весь XML-документ и дают вам «да / нет», но это, похоже, позволит вам проверить отдельные узлы в документе.
Согласно «Обзору API-интерфейсов и методов обработки XML» , существует 5 основных методов анализа XML. Вот как это будет выглядеть с PHP5
— Нажмите: расширение SAX
— Потяните: это новое расширение xmlreader
— Дерево: расширение DOM
— Отображение объектов: простой XML
— Курсор: пока ничего не верю
Все они построены на libxml2 в PHP5. Согласно бенчмаркам, таким как http://xmlbench.sourceforge.net/ , libxml2 является более или менее быстрым парсером XML.
По сравнению с состоянием XML в PHP4, когда разработчики сделали удивительные вещи с SAX , PHP5 выглядит как мечта…