2011-12-24 115 views
2

我读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); 
    }); 

代码仅仅是一个例子,还有很多更怎么回事,当然)由于一些不可预见的 边缘情况

先后这种方法被尝试导致失败?我不想将大量时间投入到这样的解析器中,只是为了发现它在某些情况下会失败。我很高兴从自己的错误中吸取教训,但我更愿意向别人学习。

+2

确保您在XML中嵌入PHP周围使用<![CDATA [...]]>,并查看使用类似技术的其他工具,如phing – 2011-12-24 15:44:09

+0

感谢@MarkBaker-I我们一定会研究Phing的文档/源代码(*如果你知道使用这种技术的任何其他工具,我很想知道它们)*关于使用'<![CDATA]'块进行封装;那不会否定处理指令解析技术? – Dan 2011-12-24 15:47:11

+0

由于php是基于字符串的,所以输出非常容易变为无效的XML。您可能想要尝试解析生成的字符串,或者强制PHP返回节点而不是字符串。 – 2011-12-24 15:57:18

回答

1

这似乎是比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,你应该罚款

+0

谢谢@cbuckley - 这是一个非常值得一提的边缘案例。虽然我不认为这是一个问题,但我认为CDATA方法可能会更好。利用处理指令解析,似乎是最好的解决方案。除了在图书馆中编写* gotcha *文档概述您的示例之外,我还可以考虑采取哪些措施来避免这种可能的问题? (* XML文件将由客户端程序员编写,所以如我所提到的,我必须在文档中记下这个警告,但我宁愿尽可能地使它万无一失*) – Dan 2011-12-24 17:33:33

+0

CDATA有相同的警告有自己的结束分隔符,']]>'。没有什么是足够合格的傻瓜万无一失:-) – cmbuckley 2011-12-24 18:30:02

+1

再次感谢@cbuckley - 足够真实;因为无论如何PHP代码片段需要位于某个元素中(在我的例子中*'callback',但我仍然决定*),或许我可以允许任何一种格式(* CDATA或PI *),让客户端选择(*像单引号或双引号*)最合适。正如我最近的编辑继续说的那样,我对使用XML感兴趣,因为它是一种经过测试并且支持多种语言的真正语言,但对于我可以封装PHP的其他“元语言”的任何建议都值得欢迎。 – Dan 2011-12-24 18:49:04