phpQuery是一个非常好的工具,它在过去解析了格式良好的XHTML和XML文档,但是我最近遇到了一个问题,试图选择在其标记名中包含冒号的元素,例如如下:
<isc:thumb><![CDATA[http://example.com/foo_thumb.jpg]]></isc:thumb>
我尝试使用pq()
函数来选择所有这些元素:
foreach ( pq("isc:thumb") as $thumbnail ) {
print pq( $thumbnail )->text();
}
不幸的是,这无所事事。如果我尝试另一个元素,例如id
的标记名,结果会按预期弹出。
答案 0 :(得分:6)
您正在尝试查找属于thumb
命名空间的isc
元素(请参阅XML namespace);不是名为isc:thumb
的标记。
phpQuery可以很高兴地查询命名空间元素,就像你想要做的那样。相反,只需以namespace|tagname
形式提供标记(即isc|thumb
)。值得注意的是,命名空间必须使用phpQuery的XPath处理程序(它只是一个DOMXPath
对象)注册,以便能够识别命名空间。
这是一个示例XML文档的快速示例(显然,使用您自己的XML并确保提供正确的名称空间URI)。
phpQuery::newDocumentXML('<root xmlns:isc="urn.example.isc">
<isc:thumb><![CDATA[http://example.com/foo_thumb.jpg]]></isc:thumb>
<isc:thumb><![CDATA[http://example.com/bar_thumb.jpg]]></isc:thumb>
</root>
');
phpQuery::getDocument()->xpath->registerNamespace('isc', 'urn.example.isc');
foreach ( pq("isc|thumb") as $thumbnail ) {
echo pq( $thumbnail )->text() . PHP_EOL;
}
哪个输出:
http://example.com/foo_thumb.jpg
http://example.com/bar_thumb.jpg