在PHP4中用于XML解析/读取的内容
不幸的是,我必须在PHP4
服务器上的一个较旧的Web应用程序中工作。
现在它需要解析很多XML来调用
webservices'(自定义协议,没有SOAP / REST)。
在" PHP5"下,我将使用" SimpleXML",但该功能不可用。
PHP4中有Dom XML,但PHP5中已不再是缺省值。
还有哪些其他选择?
我正在寻找一种在迁移后仍可在PHP5上运行的解决方案。
如果可以使用模式验证XML,那将是一个不错的选择。
解决方案
有一个simpleXML反向端口:http://www.ister.org/code/simplexml44/index.html
如果可以安装,那将是最好的解决方案。
它可能有点草根,但是如果它适用于我们正在使用的数据,则可以使用XSLT将XML转换为可用的东西。显然,一旦升级到PHP5,XSLT仍然可以使用,我们可以随时迁移到DOM解析。
安德鲁
我会赞同Rich Bradshaw关于simpleXML反向端口的建议,但是如果这不是一个选择,那么xml_parse将在PHP4中完成这项工作,并且在移植到5之后仍然可以工作。
$xml = ...; // Get your XML data $xml_parser = xml_parser_create(); // _start_element and _end_element are two functions that determine what // to do when opening and closing tags are found xml_set_element_handler($xml_parser, "_start_element", "_end_element"); // How to handle each char (stripping whitespace if needs be, etc xml_set_character_data_handler($xml_parser, "_character_data"); xml_parse($xml_parser, $xml);
这里有一个很好的教程,关于如何在PHP4中解析XML,这可能对我们有用。
如果可以使用xml_parse,请继续使用。它功能强大,快速且与PHP5兼容。但是,它不是DOM解析器,而是一个更简单的基于事件的解析器(也称为SAX解析器),因此,如果我们需要访问树,则必须将流编组为自己的树。这很简单。使用s堆栈,并在start-element上将项目压入它,然后在end-element上弹出。
只要它的性能足以满足需求,我肯定会推荐SimpleXML backport。 xml_parse的演示看起来很简单,但是根据我的经验,它很快就会变得很毛茸茸。内容处理程序函数不会获取有关解析器在树中的位置的任何上下文信息,除非我们对其进行跟踪并在开始和结束标记处理程序中提供它。因此,我们或者为每个开始/结束标签调用函数,或者抛出全局变量以跟踪我们在树中的位置。
显然,SimpleXML反向移植会慢一些,因为它是用PHP编写的,必须在可用之前解析整个文档,但是编码的简便性弥补了它的不足。
也许还可以考虑查看PEAR中可用的XML包,特别是XML_Util,XML_Parser和XML_Serializer。