Разбор PHP встроен в XML
Я прочитал этот вопрос / ответ, однако там не было никаких упоминаний о том, что это "плохая идея", и, к сожалению, любой поисковый запрос со словами parse, xml и php обычно дает информацию о разборе XML с помощью PHP (через SimpleXML или что-то еще)
Короткий вопрос - является ли это жизнеспособным решением для встраивания PHP в XML, его извлечения (и выполнения) по условию, путем нацеливания на узлы инструкций обработки во время синтаксического анализа XML, или я лаю дерево, чреватое проблемами?
Расширение - возможно, проблема не столько в XML, сколько в выборе подходящего "метаязыка", с помощью которого я могу выполнять запросы в соответствии с условиями и выполнять содержащийся фрагмент PHP. XML казался хорошим кандидатом для своей структуры, переносимости и простоты (несмотря на многословность)
Я подумал о том, чтобы просто вернуться к обычному PHP, используя массивы в качестве структуры данных, но любого структурированного метаязыка будет достаточно в качестве оболочки. Предложения вашего предпочтительного языка для такой задачи более чем приветствуются.
Во всяком случае, я работал над движком, который принимает XML-файлы со встроенным PHP. Я анализирую данные XML (в моем случае с помощью обратных вызовов SAX) и, в зависимости от некоторого ввода, чтобы помочь с "запросом" данных XML, соответствующий встроенный PHP извлекается и запускается с eval()
,
(Я знаю; "Если eval()
это ответ, вы почти наверняка задаете неправильный вопрос. ", но в данный момент меня это не касается)
В итоге я получаю что-то вроде:
<root>
<node>
<parameters>
<!-- some stuff -->
</parameters>
<callback>
<?php
function(){
// do some stuff
};
?>
</callback>
</node>
<node>
<parameters>
<!-- some other stuff -->
</parameters>
<callback>
<?php
function(){
// do some other stuff
};
?>
</callback>
</node>
</root>
Я могу разобрать PHP, установив обратный вызов с xml_set_processing_instruction_handler()
что в конечном итоге делает:
xml_set_processing_instruction_handler($parser, function($parser, $target, $func)
{
// obtain some parameters into $data
call_user_func(eval("return {$func};"), $data);
});
(код является только примером, здесь, конечно, происходит гораздо больше)
Была ли предпринята попытка такого подхода, что привело к неудаче из-за непредвиденного крайнего случая? Я не хочу тратить много времени на такой синтаксический анализатор, только для того, чтобы выяснить, что при некоторых обстоятельствах он потерпит неудачу. Я счастлив учиться на собственных ошибках, но я бы предпочел учиться на чужих.
2 ответа
Это кажется более подходящим подходом, чем пользовательский подход Phing: объявить AdhocTask как CDATA и выполнить код внутри. Обратите внимание, что в исходном коде они просто оценивают содержимое элемента.
Одно замечание, которое я вижу, упоминается в документации http://php.net/manual/en/function.xml-set-processing-instruction-handler.php: "Конечный тег PI (?>) Нельзя заключать в кавычки". Это означает, что следующее будет представлять проблему:
<callback>
<?php
function() {
return '?>';
};
?>
</callback>
Этого довольно легко избежать:
<callback>
<?php
function() {
return '?' . '>';
};
?>
</callback>
Кроме этого, до тех пор, пока вы принимаете обычные меры предосторожности eval(), все будет в порядке!
Чтобы понять, как использовать "синтаксический анализ PHP, встроенного в XSLT", обратитесь к этому руководству registerPHPFunctions.
Для понимания использования "PHP в XML" (как обычно использование PHP "в HTML") см. http://code.google.com/p/smallest-php-xml-xsl-framework/ Это приложение с XML+PHP (PHP генерирует XML) и XSLT в качестве необязательной системы шаблонов. В архитектуре MVC XML + PHP выполняют "обработку MVC-модели", а XSLT - MVC-View (или необязательное прямое использование кода PHP в качестве View).