我正在使用DOMDocument
,我想知道是否有某种方法可以使用类似CSS的选择器来选择节点,就像我们在jQuery中所做的那样。
示例情况:我正在解析一个XML文件,其中一个代码片段如下所示:
<gesmes:Envelope>
<gesmes:subject>Reference rates</gesmes:subject>
<gesmes:Sender>
<gesmes:name>European Central Bank</gesmes:name>
</gesmes:Sender>
<Cube>
<Cube time="2009-07-13">
<Cube currency="USD" rate="1.3975"/>
<Cube currency="JPY" rate="129.03"/>
<Cube currency="BGN" rate="1.9558"/>
<Cube currency="CZK" rate="26.028"/>
</Cube>
</Cube>
</gesmes:Envelope>
使用类似jQuery的选择器访问该结构非常简单。
$("Cube[currency]")
以检索具有“currency”属性的所有Cube
元素。
但是我怎样才能对PHP的DOMDocument
做同样的事情呢?我想选择有属性的元素,或者有特定属性值的元素。
5条答案
按热度按时间krcsximq1#
如果你想通过Jquery来操作DOM,PHPQuery很适合你。
http://code.google.com/p/phpquery/
一个简单的例子,你可以用它做什么。
fruv7luv2#
看看PHP中的
DOMXPath
类。它使用XPath,所以如果你不熟悉XPath语法,你需要阅读一下。有一些关于MSDN的文档,或者如果你特别勇敢,你可以阅读W3 spec。要解决示例问题:
//cube[@currency]
是一个XPath查询,它选择文档中具有currency属性的所有元素。$cubesWithCurrencies
现在是可以迭代的DOMNodeList
。jaql4c8m3#
我创建了一个库,它允许您像使用jQuery一样抓取HTML5和XML文档。
您可以找到on GitHub库。
它应该允许你做你想做的事情!
在底层,它使用symfony/DomCrawler将CSS选择器转换为XPath选择器,并始终使用相同的DomDocument,即使在将一个对象传递给另一个对象时也是如此,以确保良好的性能。
该库还包括自己的零配置自动加载器的PSR-0兼容库。包括的例子应该工作的开箱即用,没有任何额外的配置。
使用示例:
支持的方法:
1.* 重命名为'select',原因显而易见 *
1.* 重命名为'void',因为'empty'在PHP中是保留字 *
q1qsirdb4#
您可以使用Symfony DomCrawler组件,使您能够使用css选择器进行DOM遍历:https://packagist.org/packages/symfony/dom-crawler
wqsoz72f5#
XPath正是您要寻找的here is pretty good list of possible selectors