Разбор PHP встроен в XML - PullRequest
       2

Разбор PHP встроен в XML

2 голосов
/ 24 декабря 2011

Я прочитал этот вопрос / ответ однако не было никакого упоминания о том, что это "плохая идея", и, к сожалению, ни один поисковый запрос со словами 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 ]

1 голос
/ 24 декабря 2011

Это кажется лучшим подходом, чем пользовательский подход Phing: объявить AdhocTask как CDATA и выполнить код внутри. Обратите внимание, что в исходном коде они просто оценивают содержимое элемента.

Одно замечание, которое я вижу, упоминается в документации xml_set_processing_instruction_handler () : «Конечный тег PI (?>) Нельзя заключать в кавычки». Это означает, что следующее будет представлять проблему:

<callback>
    <?php
        function() {
            return '?>';
        };
    ?>
</callback>

Этого довольно легко избежать:

<callback>
    <?php
        function() {
            return '?' . '>';
        };
    ?>
</callback>

Кроме этого, до тех пор, пока вы принимаете обычные меры предосторожности eval () , с вами все будет в порядке!

0 голосов
/ 25 июля 2012

Для понимания использования "синтаксического анализа 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-представление (или необязательное прямое использование кода PHP в качестве представления).

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