Снова парсинг: SimpleXML

Я уже останавливался на теме парсинга XML-файлов в статье Как я научился парсить XML в PHP. Сегодня я обнаружил, что есть способ вытаскивать данные из XML гораздо более приятный и менее подверженный ошибкам. Способ этот основан на использовании расширения SimpleXML, которое доступно в PHP начиная с версии 5.

Вообще, Вы наверно заметили, что я в последних статьях касаюсь только версии 5, не рассматривая при этом более старые версии. Но на то они и старые, чтобы их не рассматривать :) Сейчас практически все хостинги поддерживают версию 5 интерпретатора пхп.

Итак. Будем рассматривать, что же это за расширение такое - SimpleXML. Оказывается, вытащить данные из XML теперь проще простого. Например, у нас есть файл со следующей структурой, описывающей книгу:

books.xml

<?xml version=’1.0?>
<books>
  <book>
    <title>Название книги</title>
    <author>Имя и фамилия автора</author>
    <pages>Количество страниц</pages>
    <isbn>ISBN</isbn>
    <year>Год издания</year>
  </book>
</books>

Так вот, чтоб вытащить например все книги из этого хранилища, нам достаточно превратить этот файл в объект с помощью simplexml_load_file и перечислить элементы book:

getbooks.php

<?
  $xml = simplexml_load_file(‘books.xml’);
  foreach ($xml->book as $book) {
    $book->title// извлекаем название книги
    $book->author; // извлекаем имя и фамилию автора
    …
  }
?>

Правда красиво? А главное - легко!

Кстати замечу, что если у нас есть содержимое xml в памяти (переменной), а не на диске (в файле), то можно использовать simplexml_load_string:

getbooks2.php

<?
// так мы присвоим переменной $xml_content содержимое документа
$xml_content = <<<XML
<?xml version=’1.0?>
  <books>
    <book>
      <title>Название книги</title>
      <author>Имя и фамилия автора</author>
      <pages>Количество страниц</pages>
      <isbn>ISBN</isbn>
      <year>Год издания</year>
    </book>
  </books>

XML;

  $xml = simplexml_load_string($xml_content);
  foreach ($xml->book as $book) {
    $book->title// извлекаем название книги
    $book->author; // извлекаем имя и фамилию автора
    …
  }
?>

Заметили, как я тут применил еще одну возможность php для объясления строковых переменных? Конечно заметили! Строку можно объявлять и без кавычек, но для этого ее нужно обрамлять строками

<<<[ИДЕНТИФИКАТОР]
[строка]
[ИДЕНТИФИКАТОР];

Между <<< и [ИДЕНТИФИКАТОР] не должно быть пробелов.

Ну это конечно к статье не относится. Я так, кстати заметил просто.

Вооот, теперь мы знаем, как легче можно извлечь информацию из xml-документов. Кстати, SimpleXML умеет работать с языком запросов XPath, который тоже используется для извлечения информации из XML-документа, но на этом я остановлюсь в отдельной статье.

Популярность: 69%

Читайте также:


 #  #  #  #  #  #  #  #  #  #

19 Ответов на “Снова парсинг: SimpleXML”

  1. stussy
    Июль 1st, 2008

    гут, тоже закинул на социалку

  2. Виктор
    Июль 2nd, 2008

    Было бы интересно узнать поподробнее

  3. novice
    Июль 2nd, 2008

    Что именно Вы бы хотели узнать поподробнее?

  4. Cooler
    Июль 3rd, 2008

    2 novice:
    ничего он не хотел узнавать, только проспамить свой сайт =)

    SimpleXML глючный с ним надо поосторожнее. Имхо DOMDocument + XPath практичнее.

  5. Александр
    Июль 16th, 2008

    Не подскажете, как перевести из объекта SimpleXML в строку?

    Парсил xml файлик и понадобилось атрибуты элемента в массив сохранить. При попытке использовать элементы массива в sql запросе обнаружилось, что там не строка а объект SimpleXML состоящий из одного элемента.

  6. novice
    Июль 16th, 2008

    Не знаю, как выглядит Ваш код, Александр. Но я бы вытаскивал атрибуты из элемента вот так:

    <?
    $xml_content = <<<XML
    <?xml version='1.0' ?>
      <books>
        <book title="Title">
          <author>Author</author>
          <pages>Pages</pages>
          <isbn>ISBN</isbn>
          <year>Year</year>
        </book>
      </books>
    XML;

      $xml = simplexml_load_string($xml_content);
      foreach ($xml->book as $book) {
        echo (string)$book['title']; // вернет Title
      }
    ?>

    Т.е. я тут использую явное преобразование типов с помощью (string). Хотя у меня и без этого строка, а не объект.

  7. Mitya
    Август 29th, 2008

    Спасибо. Для новичков самое то=)

  8. Mitya
    Август 29th, 2008

    Комменты в 9.5 опере не работают у Вас.

  9. novice
    Август 29th, 2008

    Спасибо за замечание. В ближайшее время исправим. :)

  10. Mitya
    Август 29th, 2008

    Нет все таки работают, только не очень удобно подается информация о том, что коммент ушел на модерирование. Точнее этой информации просто нет. Поэтому и кажется, что не работают=))

  11. novice
    Август 30th, 2008

    Согласен. В плане удобства тут есть еще над чем поработать. :) Будем думать.

  12. Dmitry
    Сентябрь 4th, 2008

    Спасибо за пост!

  13. novice
    Сентябрь 4th, 2008

    Незачто!

  14. Konstantin
    Сентябрь 8th, 2008

    Проблема с SimpleXML не в том, что он глючный, а в том, что он не предоставляет некоторых специфичных возможностей, с которыми легко справляется DOM.

    Например попробуйте добавить секцию CDATA в документ. Да и добавлять потомков в документ стало возможным, только с версии PHP 5.1.4.

    Тем не менее в данный момент активно использую SimpleXml для конфигов. Т.е. конфиг чего-то там, загружаю в скрипт через Load, и получаю обьект конфигурации из которой достается все что надо, без дополнительных плясок с бубнами.

  15. novice
    Сентябрь 8th, 2008

    Мне все-таки кажется, что SimpleXml неходится немного в другой нише, нежели DOM. SimpleXML позиционирует себя так :
    “The SimpleXML extension provides a very simple and easily usable toolset to convert XML to an object that can be processed with normal property selectors and array iterators.” Другими словами его задача заключается только в том, чтобы преобразовать xml в объектную модель, а работой с этой моделью занимается уже другой инструмент. Поэтому я бы не стал называть отсутствие некоторых функций проблемой этого пакета :)

  16. Konstantin
    Сентябрь 8th, 2008

    Позиционирование - позиционированием, но когда доходит до практики, некоторые мелочи здорово портят жизнь. Получается…для считывания SimpleXML, для больших документов SAX, для манипулирования почти всем DOM. Не слишком ли получается много инструментов? Но это так ворчание. В целом я с Вами согласен.

    PS: А почему не работают извещения о комментариях? Снова найти Ваш сайт мне помог только Google Analytics.

  17. novice
    Сентябрь 9th, 2008

    Никогда не пользовался этой функцией сам - не обратил внимания, что на нашем блоге ее нет ;) В ближайшее время исправим.

  18. Андрей
    Ноябрь 8th, 2008

    Спс большое -
    реально мне ща очень нужно про парсить XML файл - и скок не смотрел ничего не понимал.
    А вот SimpleXML это вещь !!!

    Спс еще раз.

  19. Предводителев Сергей
    Ноябрь 11th, 2008

    Информация про парсинг XML помогла уяснить некоторые моменты. Спасибо :)
    А вот про такое объявление строковых переменных вижу впервые… Думаю в некоторых случаях будет очень удобно применять.

Оставить комментарий