解析嵌入在XML中的PHP
然而,我在书中没有提到这是一个“坏主意”,不幸的是,任何带有parse、xml和php的搜索查询通常都会产生关于使用php解析xml的信息(通过或其他方式) 简短的问题——通过在XML解析过程中以处理指令节点为目标,将PHP嵌入到XML中,有条件地提取(并执行)它,这是一个可行的解决方案,还是一个充满问题的树 扩展——也许问题不在于XML,而在于选择合适的“元语言”,我可以根据它执行查询以满足条件,并执行包含的PHP代码段。XML的结构、可移植性和简单性(尽管冗长)似乎是一个很好的候选者解析嵌入在XML中的PHP,php,xml,xml-parsing,processing-instruction,Php,Xml,Xml Parsing,Processing Instruction,然而,我在书中没有提到这是一个“坏主意”,不幸的是,任何带有parse、xml和php的搜索查询通常都会产生关于使用php解析xml的信息(通过或其他方式) 简短的问题——通过在XML解析过程中以处理指令节点为目标,将PHP嵌入到XML中,有条件地提取(并执行)它,这是一个可行的解决方案,还是一个充满问题的树 扩展——也许问题不在于XML,而在于选择合适的“元语言”,我可以根据它执行查询以满足条件,并执行包含的PHP代码段。XML的结构、可移植性和简单性(尽管冗长)似乎是一个很好的候选者 我考虑
我考虑过回到普通的PHP,使用数组作为数据结构,但任何结构化的元语言都可以作为包装器。对于这样一项任务,建议您使用您喜欢的语言是非常受欢迎的 不管怎么说,我一直在开发一个引擎,它接受带有嵌入式PHP的XML文件。我解析XML数据(在我的例子中使用SAX回调),并根据一些输入来帮助“查询”XML数据,使用
eval()
提取并运行适当的嵌入式PHP
(我知道;“如果答案是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>
(代码只是一个示例,当然这里还有很多内容)
是否尝试过这种方法,但由于某些不可预见的原因导致失败
边缘案例?我不想在这样一个解析器上花费大量的时间,却发现它在某些情况下会失败。我很乐意从自己的错误中学习,但我更愿意从别人的错误中学习。这似乎是一种比Phing的自定义方法更好的方法,即声明为CDATA并在其中执行代码。请注意,在中,它们只是计算元素的内容 我可以看到的一个警告是:“不能引用PI结束标记(?>)。”这意味着以下内容将出现问题:
<callback>
<?php
function() {
return '?>';
};
?>
</callback>
这是很容易避免的:
<callback>
<?php
function() {
return '?' . '>';
};
?>
</callback>
除此之外,只要你服用,你就会好的 要了解“解析XSLT中嵌入的PHP”的用法,请参阅
要了解“PHP转换为XML”(与通常使用PHP转换为HTML一样)的用法,请参阅
它是一个使用XML+PHP(PHP生成XML)和XSLT作为可选模板系统的应用程序。在MVC架构中,XML+PHP执行“MVC模型处理”并XSLT MVC视图(或可选直接使用PHP代码作为视图)。确保您在XML中使用的是嵌入式PHP,并查看使用类似技术的其他工具,比如phingThanks@MarkBaker——我一定会在Phing文档/源代码中查找关于使用
块包装的信息(如果您知道任何其他使用此技术的工具,我很想知道);这不会否定处理指令解析技术吗?因为php是基于字符串的,所以您的输出很容易变成无效的XML。您可能希望尝试解析生成的字符串,或者强制PHP返回节点而不是字符串。使用bracesPer,这些字符可以在PI部分中显示为未缩放。另外,“PI不是文档字符数据的一部分”(§2.6)。谢谢@cbuckley——这是一个非常值得一提的边缘案例。虽然我不认为这是一个问题,但我认为CDATA方法可能会更好。不过,利用处理指令解析似乎是最好的解决方案。除了在概述示例的库文档中编写gotcha外,我还可以考虑哪些因素来帮助避免这个可能的问题?(XML文件将由客户端程序员编写,所以正如我所提到的,我必须在文档中记下这一警告,但如果可能的话,我宁愿让它万无一失)CDATA也有同样的警告,它有自己的结束分隔符,]>
。对于有足够资格的傻瓜来说,没有什么是万无一失的:-)再次感谢@cbuckley——这是真的;由于PHP代码段无论如何都需要位于某个元素中(在我的示例中是回调,但我仍在决定),也许我可以允许任何一种格式(CDATA或PI),并让客户端选择(如单引号或双引号)最合适的格式。正如我最近的编辑所说,我对使用XML很感兴趣,因为它是一种经过测试的、真正的语言,有很多支持,但是任何关于我可以封装PHP的其他“元语言”的建议都是非常受欢迎的。
<callback>
<?php
function() {
return '?' . '>';
};
?>
</callback>