Разбор 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).

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