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做一个很好的起点:

http://www.w3schools.com/xsl/

可以执行XSL转换服务器端或客户端(使用JS,ActiveX或其他)。

如果你仍然讨厌xsl的这种想法,你可以看看内置于PHP中的xml解析 - Google for SAX解析器PHP--这是一个回调实现来构建自定义解析器,目前使用libxml2。

+0

是的,我知道XSL的。我在2002/2003年度做了很多,我发现它真的很糟糕。 PHP是否允许使用适当的回调进行XSL转换? – cletus 2008-11-29 05:41:37

非也正则表达式。 XML格式可以以不影响其内容的方式进行更改(换句话说,XML处理库不可见),但对于正则表达式来说却很重要。这种代码很快就成为维护噩梦。

至于要使用的解析器(SAX,StAX的,DOM,JDOM,dom4j的,XOM,等等),