В чем разница между различными библиотеками синтаксического анализа XML в PHP5?

StackOverflow https://stackoverflow.com/questions/246819

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

теги).

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

  • ПростоXML — это API-интерфейс, специфичный для PHP, который также основан на объектах, но должен быть намного менее «кратким», чем 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-парсер (реализация САКС, независимый от языка интерфейс, но не упоминаемый под этим именем в руководстве) — это библиотека гораздо более низкого уровня, которая служит совсем другой цели.Он не создает объекты для вас.По сути, это просто упрощает написание собственного анализатора XML, поскольку он выполняет работу по переходу к следующему токену и выяснению типа токена, например, имени тега и является ли он открывающим или закрывающим тегом. .Затем вам нужно написать обратные вызовы, которые должны запускаться каждый раз при обнаружении токена.Все задачи, такие как представление документа в виде объектов/массивов в дереве, манипулирование документом и т. д., необходимо будет реализовать отдельно, поскольку все, что вы можете сделать с помощью парсера XML, — это написать парсер низкого уровня.

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

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

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

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

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

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

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

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

Это действительно зависит от того, чего вы пытаетесь достичь. Для извлечения достаточно больших объемов данных, т. Е. Многих записей, скажем, информации о продукте с веб-сайта магазина, я бы, вероятно, использовал 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top