Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析嵌入在XML中的PHP_Php_Xml_Xml Parsing_Processing Instruction - Fatal编程技术网

解析嵌入在XML中的PHP

解析嵌入在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的结构、可移植性和简单性(尽管冗长)似乎是一个很好的候选者 我考虑

然而,我在书中没有提到这是一个“坏主意”,不幸的是,任何带有parsexmlphp的搜索查询通常都会产生关于使用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>