2

我读了这个问题/答案,但是没有提到它是一个“坏主意”,不幸的是,任何带有parsexmlphp字样的搜索查询通常都会产生有关使用 PHP 解析 XML 的信息(通过SimpleXML或其他

简短的问题——通过在 XML 解析期间定位处理指令节点,将 PHP 嵌入到 XML 中,有条件地提取(和执行)它是一个可行的解决方案,还是我在树上一棵充满问题的树?

扩展——也许问题与 XML 关系不大,而更多地与选择适当的“元语言”有关,我可以对它执行查询以满足条件,并执行包含的 PHP 片段。XML 的结构、可移植性和简单性(尽管冗长)似乎是一个很好的候选者
。非常欢迎您对此类任务的首选语言提出建议。

无论如何,我一直在研究一个接受嵌入 PHP 的 XML 文件的引擎。我解析 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>

我可以通过设置xml_set_processing_instruction_handler()最终执行的回调来解析 PHP:

xml_set_processing_instruction_handler($parser, function($parser, $target, $func)
    {
        // obtain some parameters into $data
        call_user_func(eval("return {$func};"), $data);
    });

代码只是一个例子,当然这里还有很多事情要做

由于某些不可预见的边缘情况,是否尝试过这种方法导致失败?我不想在这样的解析器上投入大量时间,却发现它在某些情况下会严重失败。我很高兴从自己的错误中学习,但我更愿意从别人的错误中学习。

4

2 回答 2

1

这似乎比 Phing 将AdhocTask声明为 CDATA 并在其中执行代码的自定义方法更好。请注意,在源代码中,它们只是评估元素的内容。

xml_set_processing_instruction_handler() 文档中提到了我可以看到的一个警告:“不能引用 PI 结束标记 (?>)。” 这意味着以下将出现问题:

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

这很容易避免:

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

除此之外,只要你采取通常的 eval() 预防措施,你应该没问题!

于 2011-12-24T16:27:18.553 回答
0

要了解“解析嵌入在 XSLT 中的 PHP”的使用,请参阅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 代码作为视图)。

于 2012-07-25T12:03:00.993 回答