Разбор XML и преобразование в PHP? - PullRequest
0 голосов
/ 29 ноября 2008

У меня есть пользовательская схема XML, определенная для отображения страницы, которая помещает элементы на страницу, оценивая элементы XML на странице. В настоящее время это реализовано с использованием функций preg regex, в первую очередь превосходной функции 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); может обрабатывать вложенные элементы одного или разных типов; а также хорошо обрабатывает атрибуты (например, как ассоциативный массив).

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

Ответы [ 3 ]

3 голосов
/ 29 ноября 2008

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);
3 голосов
/ 29 ноября 2008

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

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

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

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

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

0 голосов
/ 21 марта 2011

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

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

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