Разбор и преобразование XML в PHP?

У меня есть настраиваемая схема XML, определенная для отображения страницы, которая помещает элементы на страницу, оценивая элементы XML на странице. В настоящее время это реализовано с использованием функций регулярного выражения preg, в первую очередь превосходной функции preg_replace_callback, например:

...
$s = preg_replace_callback("!<field>(.*?)</field>!", replace_field, $s);
...

function replace_field($groups) {
  return isset($fields[$group[1]) ? $fields[$groups[1]] : "";
}

Просто как пример.

Теперь это работает очень хорошо ... до тех пор, пока элементы XML не вложены. На этом этапе все становится намного сложнее, например, если у вас есть:

<field name = "outer">
  <field name = "inner">
    ...
  </field>
</field>

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

Я бы хотел пакет преобразования XML, который:

позволяет мне условно оценивать / включать содержащееся в нем дерево документов или нет, в идеале на основе функции обратного вызова (аналогично preg_replace_callback); может обрабатывать вложенные элементы одного или разных типов; и красиво обрабатывает атрибуты (например, как ассоциативный массив).

Что может мне помочь на этом пути?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
1 302
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для этого вы можете использовать XSL - сначала сопоставьте внутренние шаблоны.

Вот хорошая отправная точка для изучения того, что вы можете делать с XSL:

http://www.w3schools.com/xsl/

Вы можете выполнить преобразование xsl на стороне сервера или на клиенте (используя js, activex или другие).

Если вы все еще ненавидите эту идею xsl, вы можете взглянуть на синтаксический анализ xml, встроенный в PHP - google для синтаксического анализатора SAX PHP, который является реализацией обратного вызова для создания вашего собственного синтаксического анализатора, в настоящее время использующего libxml2.

Да, я знаю XSL. Я делал много этого еще в 2002/2003 году, и мне это показалось очень неприятным. Допускает ли PHP преобразования XSL с соответствующими обратными вызовами?

cletus 29.11.2008 08:41

Да, вы можете делать в PHP практически все, что вы можете делать с помощью старой простой библиотеки libxml2. В следующем ответе содержится подробная информация о регистрации функций php для использования в xsl.

Klathzazt 29.11.2008 18:43
Ответ принят как подходящий

Класс PHP XSLTProcessor (ext / xsl - PHP 5 включает расширение XSL по умолчанию и может быть включен путем добавления аргумента --with-xsl[=DIR] в строку конфигурации) довольно сложен и позволяет, среди прочего, использовать функции PHP в вашем документе XSL с помощью метода XSLTProcessor::registerPHPFunctions(). .

Следующий пример беззастенчиво взят из Страница руководства PHP:

$xml = '<allusers>
 <user>
  <uid>bob</uid>
 </user>
 <user>
  <uid>joe</uid>
 </user>
</allusers>';
$xsl = '<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0" 
     xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
     xmlns:php = "http://php.net/xsl">
<xsl:output method = "html" encoding = "utf-8" indent = "yes"/>
 <xsl:template match = "allusers">
  <html><body>
    <h2>Users</h2>
    <table>
    <xsl:for-each select = "user">
      <tr><td>
        <xsl:value-of
             select = "php:function(\'ucfirst\',string(uid))"/>
      </td></tr>
    </xsl:for-each>
    </table>
  </body></html>
 </xsl:template>
</xsl:stylesheet>';
$xmldoc = DOMDocument::loadXML($xml);
$xsldoc = DOMDocument::loadXML($xsl);

$proc = new XSLTProcessor();
$proc->registerPHPFunctions();
$proc->importStyleSheet($xsldoc);
echo $proc->transformToXML($xmldoc);

Определенно не регулярные выражения. Форматы XML могут изменяться способами, не влияющими на их содержимое (другими словами: невидимыми для библиотек обработки XML), но важны для регулярных выражений. Такой код быстро превращается в кошмар обслуживания.

Относительно того, какой парсер использовать (SAX, StAX, DOM, JDOM, dom4j, XOM и т. д.),

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