В чем разница между различными библиотеками разбора XML в PHP5? - PullRequest
8 голосов
/ 29 октября 2008

Оригинальный вопрос ниже, но я изменил название, потому что я думаю, что будет легче найти других с таким же сомнением. В конце концов, документ XHTML является документом XML.

Это вопрос для начинающих, но я хотел бы знать, какая библиотека, на ваш взгляд, является лучшей для анализа документов XHTML в PHP5?

Я сгенерировал XHTML из файлов HTML (которые были созданы с использованием Word: S) с помощью Tidy, и я знаю, что мне нужно заменить некоторые элементы из них (например, элемент and, заменить некоторые атрибуты в тегах

).

Я не очень часто использовал XML, кажется, есть много вариантов для разбора в PHP (простой XML, DOM и т. Д.), И я не знаю, все ли они могут делать то, что мне нужно, что самый простой в использовании.

Извините за мой английский, я из Аргентины. Спасибо!

Я немного больше информации: У меня много HTML-страниц, созданных в Word 97. Я использовал Tidy для очистки и превращения их в XHTML Strict, так что теперь они все совместимы с XML. Я хочу использовать анализатор XML, чтобы найти некоторые элементы и заменить их (логика, с помощью которой я это делаю, не имеет значения). Например, я хочу, чтобы все страницы использовали одну и ту же таблицу стилей CSS и атрибуты класса для унифицированного внешнего вида. Это все статичные страницы, которые содержат юридические документы, ничего странного там нет. Какие из расширений я должен использовать? Достаточно ли SimpleXML? Должен ли я изучать DOM, несмотря на то, что он более сложный?

Ответы [ 7 ]

6 голосов
/ 29 октября 2008

Вы можете использовать SimpleXML , который включен в установку PHP по умолчанию. Это расширение предлагает простой объектно-ориентированный доступ к XML-структурам.

Там также DOM XML . Недостатком этого расширения является то, что его немного сложнее использовать и что оно не включено по умолчанию.

4 голосов
/ 09 апреля 2009
  • DOM - это стандартный, независимый от языка API для иерархических данных, таких как XML, который был стандартизирован W3C. Это богатый API с большим количеством функций. Он основан на объектах, поскольку каждый узел является объектом.

    DOM хорош, когда вы не только хотите читать или писать, но вы хотите много манипулировать узлами существующего документа, например вставлять узлы между другими, изменять структуру и т. Д.

  • SimpleXML - это специфичный для PHP API, который также основан на объектах, но должен быть намного менее «кратким», чем DOM: простые задачи, такие как поиск значения узла или поиск его дочерних элементов займет намного меньше кода. Его API не так богат, как DOM, но он по-прежнему включает в себя такие функции, как поиск XPath, и базовую возможность работы с документами с несколькими пространствами имен. И, что важно, он по-прежнему сохраняет все функции вашего документа, такие как разделы XML CDATA и комментарии, даже при том, что он не включает функции для их манипулирования.

    SimpleXML очень хорош только для чтения: если все, что вы хотите сделать, это прочитать документ XML и преобразовать его в другую форму, то это сэкономит вам много кода. Также неплохо, когда вы хотите сгенерировать документ или выполнить базовые манипуляции, такие как добавление или изменение дочерних элементов или атрибутов, но это может усложнить (но не сделать невозможным) много манипуляций с существующими документами. Например, нелегко добавить дочерний элемент между двумя другими; addChild вставляет только после других элементов. SimpleXML также не может выполнять преобразования XSLT. У него нет таких вещей, как 'getElementsByTagName' или getElementById ', но если вы знаете XPath, вы все равно можете делать такие вещи с SimpleXML.

    Объект SimpleXMLElement несколько «магический». Свойства, которые он предоставляет, если вы var_dump / printr / var_export не соответствуют его полному внутреннему представлению. Он предоставляет некоторые из своих дочерних элементов, как если бы они были свойствами, доступ к которым можно получить с помощью оператора ->, но при этом он сохраняет внутренний документ полностью, и вы можете делать такие вещи, как доступ к дочернему элементу, имя которого является зарезервированным словом с помощью [] оператор, как если бы это был ассоциативный массив.

Вам не нужно полностью фиксировать одно или другое, потому что PHP реализует функции:

  • simplexml_import_dom (DOMNode)
  • dom_import_simplexml (SimpleXMLElement)

Это полезно, если вы используете SimpleXML и вам нужно работать с кодом, который ожидает узел DOM или наоборот.

PHP также предлагает третью библиотеку XML:

  • XML Parser (реализация SAX , независимого от языка интерфейса, но не упоминаемого под этим именем в руководстве) - библиотека гораздо более низкого уровня, которая служит совсем другой цели. Он не строит объекты для вас. Это в основном просто облегчает написание вашего собственного синтаксического анализатора XML, потому что он выполняет работу по переходу на следующий токен и выясняет тип токена, например, какое имя тега и является ли он открывающим или закрывающим тегом, для вас. , Затем вы должны написать обратные вызовы, которые должны запускаться при каждом обнаружении токена. Все задачи, такие как представление документа в виде объектов / массивов в дереве, манипулирование документом и т. Д., Должны выполняться отдельно, потому что все, что вы можете сделать с помощью синтаксического анализатора XML, - это написать синтаксический анализатор низкого уровня.

    Функции XML Parser по-прежнему весьма полезны, если у вас есть определенные требования к памяти или скорости. С его помощью можно написать синтаксический анализатор, который может анализировать очень длинный XML-документ, не сохраняя все его содержимое в памяти сразу. Кроме того, если вы не заинтересованы во всех данных и не хотите или не хотите, чтобы они помещались в дерево или набор объектов PHP, тогда это может быть быстрее. Например, если вы хотите отсканировать документ XHTML и найти все ссылки, а вам не нужна структура.

4 голосов
/ 29 октября 2008

Просто чтобы прояснить путаницу здесь. В PHP есть несколько библиотек XML, потому что у php4 не было хороших вариантов в этом направлении. Начиная с PHP5, у вас есть выбор между SimpleXml , DOM и парсером экспатов на основе саксофона . Последний также существовал в php4. У php4 также есть расширение DOM, которое не совпадает с расширением php5.

DOM и SimpleXml являются альтернативами одной проблемной области; Они загружают документ в память и позволяют получить к нему доступ в виде древовидной структуры. DOM - довольно громоздкий API, но он также очень последовательный и реализован на многих языках, что означает, что вы можете повторно использовать свои знания в разных языках (например, в Javascript). SimpleXml может быть проще на начальном этапе.

Анализатор SAX - это другой зверь. Он обрабатывает XML-документ как поток тегов. Это полезно, если вы имеете дело с очень большими документами, поскольку вам не нужно хранить все это в памяти.

Для вашего использования я бы, вероятно, использовал API DOM.

1 голос
/ 29 октября 2008

Я предпочитаю SimpleXMLElement , поскольку его довольно просто использовать для пролистывания элементов.

Редактировать: В нем говорится, что информация о версии недоступна, но доступна в PHP5, по крайней мере, 5.2.5, но, возможно, раньше.

Хотя это действительно личный выбор, есть множество расширений XML .

Имейте в виду, что многие парсеры XML будут блокироваться, если у вас недопустимая разметка - XHTML должен быть XML, но не всегда!

0 голосов
/ 29 октября 2008

Это действительно зависит от того, чего вы пытаетесь достичь. Для извлечения достаточно больших объемов данных, т. Е. Многих записей, скажем, информации о продукте с веб-сайта магазина, я бы, вероятно, использовал Expat, поскольку он предположительно немного быстрее ... Лично у меня достаточно XML, чтобы создать заметное повышение производительности. В этих количествах вы также можете использовать SQL.

Я рекомендую использовать SimpleXML. Это довольно интуитивно понятно, легко использовать / писать. Также отлично работает с XPath.

Никогда в действительности не нужно было много использовать DOM, но если вы используете парсер XML для чего-то большего, чем вы описываете, возможно, вы захотите его использовать, поскольку он немного более функциональный, чем SimpleXML.

Вы можете прочитать обо всех трех в W3C Schools:

http://www.w3schools.com/php/php_xml_parser_expat.asp

http://www.w3schools.com/php/php_xml_simplexml.asp

http://www.w3schools.com/php/php_xml_dom.asp

0 голосов
/ 29 октября 2008

В прошлом году я немного проанализировал XML в PHP5 и решил использовать комбинацию SimpleXML.

DOM немного полезнее, если вы хотите создать новое дерево XML или добавить к уже существующему, оно немного более гибкое.

0 голосов
/ 29 октября 2008

Прошло много времени (2 года и более) с тех пор, как я работал с синтаксическим анализом XML в PHP, но у меня всегда были хорошие, полезные результаты из пакета XML_Parser Pear . Сказав это, я имел минимальное влияние на PHP5, поэтому я не знаю, есть ли лучшие, встроенные альтернативы в наши дни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...