使用phpQuery选择特殊的XML标签

Ari*_*tle 4 php xml phpquery

phpQuery是一个非常好的工具,它在过去解析了格式良好的XHTML和XML文档时帮助了我,但是我最近遇到了一个问题,试图选择在其标记名中有冒号的元素,如下所示:

<isc:thumb><![CDATA[http://example.com/foo_thumb.jpg]]></isc:thumb>
Run Code Online (Sandbox Code Playgroud)

我试图使用该pq()函数来选择所有这些元素:

foreach ( pq("isc:thumb") as $thumbnail ) {
  print pq( $thumbnail )->text();
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这无济于事.如果我尝试另一个元素,比如标记名id,则结果会按预期弹出.

sal*_*the 6

您正在尝试查找thumb属于isc命名空间的元素(请参阅XML命名空间); 不是一个名为的标签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;
}
Run Code Online (Sandbox Code Playgroud)

哪个输出:

http://example.com/foo_thumb.jpg
http://example.com/bar_thumb.jpg
Run Code Online (Sandbox Code Playgroud)