PHP中的XML解析和转换?
我有一个为页面显示定义的自定义XML模式,它通过评估页面上的XML元素将元素放在页面上。PHP中的XML解析和转换?
...
$s = preg_replace_callback("!<field>(.*?)</field>!", replace_field, $s);
...
function replace_field($groups) {
return isset($fields[$group[1]) ? $fields[$groups[1]] : "";
}
只是作为一个例子:这是通过使用正则表达式浸渍功能,主要是优良preg_replace_callback功能,例如当前实施的。
现在,这个工作非常好......只要XML元素没有嵌套。在这一点上,它会变得非常复杂,如果您有以下情况:
<field name="outer">
<field name="inner">
...
</field>
</field>
您想确保先替换最里面的字段。明智地使用贪婪/非贪婪的正则表达式模式可以用来处理这些更复杂的场景,但明确的信息是,我正在达到正则表达式可以合理做到的极限,并且真的需要做XML解析。
我想是一个XML转换包:
让我有条件地评估/包括所包含的文档树或不基于回调函数理想(analagous到preg_replace_callback); 可以处理相同或不同类型的嵌套元素;和 以不错的方式处理属性(例如作为关联数组)。
什么可以帮助我一路?
PHP的XSLTProcessor
类(ext/xsl - PHP 5默认包含XSL扩展,并可以通过添加参数--with-xsl[=DIR]
到您的配置来启用它)是相当复杂,除其他事情可以让你的XSL文件中使用PHP函数由使用XSLTProcessor::registerPHPFunctions()
方法。
下面的例子是无耻地从PHP manual page捏:
$xml = '<allusers>
<user>
<uid>bob</uid>
</user>
<user>
<uid>joe</uid>
</user>
</allusers>';
$xsl = '<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:php="http://php.net/xsl">
<xsl:output method="html" encoding="utf-8" indent="yes"/>
<xsl:template match="allusers">
<html><body>
<h2>Users</h2>
<table>
<xsl:for-each select="user">
<tr><td>
<xsl:value-of
select="php:function(\'ucfirst\',string(uid))"/>
</td></tr>
</xsl:for-each>
</table>
</body></html>
</xsl:template>
</xsl:stylesheet>';
$xmldoc = DOMDocument::loadXML($xml);
$xsldoc = DOMDocument::loadXML($xsl);
$proc = new XSLTProcessor();
$proc->registerPHPFunctions();
$proc->importStyleSheet($xsldoc);
echo $proc->transformToXML($xmldoc);
您可以使用XSL来做到这一点 - 首先匹配内部模式。
这里是学习,你可以使用XSL做一个很好的起点:
可以执行XSL转换服务器端或客户端(使用JS,ActiveX或其他)。
如果你仍然讨厌xsl的这种想法,你可以看看内置于PHP中的xml解析 - Google for SAX解析器PHP--这是一个回调实现来构建自定义解析器,目前使用libxml2。
非也正则表达式。 XML格式可以以不影响其内容的方式进行更改(换句话说,XML处理库不可见),但对于正则表达式来说却很重要。这种代码很快就成为维护噩梦。
至于要使用的解析器(SAX,StAX的,DOM,JDOM,dom4j的,XOM,等等),
是的,我知道XSL的。我在2002/2003年度做了很多,我发现它真的很糟糕。 PHP是否允许使用适当的回调进行XSL转换? – cletus 2008-11-29 05:41:37