4

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,结果会按预期弹出。

4

1 回答 1

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;
}

哪个输出:

http://example.com/foo_thumb.jpg
http://example.com/bar_thumb.jpg
于 2010-04-24T22:15:43.877 回答