解析PHP嵌入到XML
我读this question/answer但是有没有它是一个“坏主意”的任何提及,可惜的话任何搜索查询解析,XML,并PHP通常会产生信息约(通过SimpleXML或任何)用PHP解析XML解析PHP嵌入到XML
短期问题 - 它是一个可行的解决方案中嵌入PHP的XML,提取(和执行)有条件地,通过在XML解析期间针对处理指令节点,还是我咆哮着一个充满了问题的树?
扩大 - 也许问题不在于处理XML,更多的是选择一种适当的“元语言”,我可以根据这种语言执行查询以满足条件,并执行包含的PHP代码段。 XML似乎很适合它的结构,可移植性和简单性(尽管详尽)
我认为刚回落到香草PHP,使用数组作为数据结构,但任何结构化的元语言就足以作为包装。对于这样的任务,您首选语言的建议是值得欢迎的。
无论如何,我一直在研究一个接受嵌入式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);
});
(代码仅仅是一个例子,还有很多更怎么回事,当然)由于一些不可预见的 边缘情况
先后这种方法被尝试导致失败?我不想将大量时间投入到这样的解析器中,只是为了发现它在某些情况下会失败。我很高兴从自己的错误中吸取教训,但我更愿意向别人学习。
这似乎是比Phing声称AdhocTask作为CDATA并在其中执行代码的自定义方法更好的方法。请注意,在source code中,它们只是评估元素的内容。
我可以看到的一个警告在xml_set_processing_instruction_handler() documentation上提到:“PI结束标记(?>)不能被引用。“这意味着下面会出现一个问题:
<callback>
<?php
function() {
return '?>';
};
?>
</callback>
这是很容易避免:
<callback>
<?php
function() {
return '?' . '>';
};
?>
</callback>
除此之外,只要你把the usual eval() precautions,你应该罚款
谢谢@cbuckley - 这是一个非常值得一提的边缘案例。虽然我不认为这是一个问题,但我认为CDATA方法可能会更好。利用处理指令解析,似乎是最好的解决方案。除了在图书馆中编写* gotcha *文档概述您的示例之外,我还可以考虑采取哪些措施来避免这种可能的问题? (* XML文件将由客户端程序员编写,所以如我所提到的,我必须在文档中记下这个警告,但我宁愿尽可能地使它万无一失*) – Dan 2011-12-24 17:33:33
CDATA有相同的警告有自己的结束分隔符,']]>'。没有什么是足够合格的傻瓜万无一失:-) – cmbuckley 2011-12-24 18:30:02
再次感谢@cbuckley - 足够真实;因为无论如何PHP代码片段需要位于某个元素中(在我的例子中*'callback',但我仍然决定*),或许我可以允许任何一种格式(* CDATA或PI *),让客户端选择(*像单引号或双引号*)最合适。正如我最近的编辑继续说的那样,我对使用XML感兴趣,因为它是一种经过测试并且支持多种语言的真正语言,但对于我可以封装PHP的其他“元语言”的任何建议都值得欢迎。 – Dan 2011-12-24 18:49:04
为了解使用“解析嵌入XSLT中的PHP”请参阅this tutorial of registerPHPFunctions。
For unde rstand使用“PHP into XML”(通常使用PHP“into HTML”)参见http://code.google.com/p/smallest-php-xml-xsl-framework/ 它是一个使用XML + PHP(PHP生成XML)和XSLT作为可选模板系统的应用程序。在MVC体系结构中,XML + PHP执行“MVC模型处理”和XSLT MVC-View(或可选地直接使用PHP代码作为视图)。
确保您在XML中嵌入PHP周围使用,并查看使用类似技术的其他工具,如phing – 2011-12-24 15:44:09
感谢@MarkBaker-I我们一定会研究Phing的文档/源代码(*如果你知道使用这种技术的任何其他工具,我很想知道它们)*关于使用' Dan 2011-12-24 15:47:11
由于php是基于字符串的,所以输出非常容易变为无效的XML。您可能想要尝试解析生成的字符串,或者强制PHP返回节点而不是字符串。 – 2011-12-24 15:57:18