css PHP DOMDocument的类似jQuery的选择器

bz4sfanl  于 2023-01-06  发布在  PHP
关注(0)|答案(5)|浏览(121)

我正在使用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做同样的事情呢?我想选择有属性的元素,或者有特定属性值的元素。

krcsximq

krcsximq1#

如果你想通过Jquery来操作DOM,PHPQuery很适合你。
http://code.google.com/p/phpquery/
一个简单的例子,你可以用它做什么。

// almost everything can be a chain
$li = null;
$doc['ul > li']
        ->addClass('my-new-class')
        ->filter(':last')
                ->addClass('last-li');
fruv7luv

fruv7luv2#

看看PHP中的DOMXPath类。它使用XPath,所以如果你不熟悉XPath语法,你需要阅读一下。有一些关于MSDN的文档,或者如果你特别勇敢,你可以阅读W3 spec
要解决示例问题://cube[@currency]是一个XPath查询,它选择文档中具有currency属性的所有元素。

$xpath = new DOMXpath($myDomDocument);
$cubesWithCurrencies = $xpath->query('//cube[@currency]');

$cubesWithCurrencies现在是可以迭代的DOMNodeList

jaql4c8m

jaql4c8m3#

我创建了一个库,它允许您像使用jQuery一样抓取HTML5和XML文档。
您可以找到on GitHub库。
它应该允许你做你想做的事情!
在底层,它使用symfony/DomCrawler将CSS选择器转换为XPath选择器,并始终使用相同的DomDocument,即使在将一个对象传递给另一个对象时也是如此,以确保良好的性能。
该库还包括自己的零配置自动加载器的PSR-0兼容库。包括的例子应该工作的开箱即用,没有任何额外的配置。
使用示例:

namespace PowerTools;

// Get file content
$htmlcode = file_get_contents( 'https://github.com' );

// Define your DOMCrawler based on file string
$H = new DOM_Query( $htmlcode );

// Define your DOMCrawler based on an existing DOM_Query instance
$H = new DOM_Query( $H->select('body') );

// Passing a string (CSS selector)
$s = $H->select( 'div.foo' );

// Passing an element object (DOM Element)
$s = $H->select( $documentBody );

// Passing a DOM Query object
$s = $H->select( $H->select('p + p') );

// Select the body tag
$body = $H->select('body');

// Combine different classes as one selector to get all site blocks
$siteblocks = $body->select('.site-header, .masthead, .site-body, .site-footer');

// Nest your methods just like you would with jQuery
$siteblocks->select('button')->add('span')->addClass('icon icon-printer');

// Use a lambda function to set the text of all site blocks
$siteblocks->text(function( $i, $val) {
    return $i . " - " . $val->attr('class');
});

// Append the following HTML to all site blocks
$siteblocks->append('<div class="site-center"></div>');

// Use a descendant selector to select the site's footer
$sitefooter = $body->select('.site-footer > .site-center');

// Set some attributes for the site's footer
$sitefooter->attr(array('id' => 'aweeesome', 'data-val' => 'see'));

// Use a lambda function to set the attributes of all site blocks
$siteblocks->attr('data-val', function( $i, $val) {
    return $i . " - " . $val->attr('class') . " - photo by Kelly Clark";
});

// Select the parent of the site's footer
$sitefooterparent = $sitefooter->parent();

// Remove the class of all i-tags within the site's footer's parent
$sitefooterparent->select('i')->removeAttr('class');

// Wrap the site's footer within two nex selectors
$sitefooter->wrap('<section><div class="footer-wrapper"></div></section>');

[...]

支持的方法:

1.* 重命名为'select',原因显而易见 *
1.* 重命名为'void',因为'empty'在PHP中是保留字 *

q1qsirdb

q1qsirdb4#

您可以使用Symfony DomCrawler组件,使您能够使用css选择器进行DOM遍历:https://packagist.org/packages/symfony/dom-crawler

相关问题