为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Simplexml 的 Xpath 根据 PHP 中的值过滤节点

使用 Simplexml 的 Xpath 根据 PHP 中的值过滤节点

PHP
烙印99 2021-10-22 16:54:13
我正在研究一种根据某些节点在 PHP 中的值来过滤它们的方法。我正在尝试返回等于“已资助”的状态节点的计数。我不确定的部分是在新过滤器 ($xml_bio_children) 中使用数组(前一个过滤器 ($xml_bio_record[0]) 的结果)。此代码不返回 $count_c 的计数。我将如何过滤 status="Funded"?感谢您提供任何线索。这是 XML:<?xml version="1.0" encoding="utf-8"?><data><record id="1A">    <congrant>        <ident>a</ident>        <status>Not Funded</status>    </congrant>    <congrant>        <ident>b</ident>        <status>Funded</status>    </congrant>    <congrant>        <ident>c</ident>        <status/>    </congrant></record><record id="1B">    <congrant>        <ident>a</ident>        <status>Not Funded</status>    </congrant>    <congrant>        <ident>b</ident>        <status>Funded</status>    </congrant>    <congrant>        <ident>c</ident>        <status/>    </congrant></record><record id="1C">    <congrant>        <ident>aaa</ident>        <status>Funded</status>    </congrant>    <congrant>        <ident>bbb</ident>        <status>Funded</status>    </congrant>    <congrant>        <ident>c</ident>        <status>Funded</status>    </congrant></record></data>这是PHP:$url_bio = "test.xml";$xml_bio = simplexml_load_file($url_bio);$xml_bio_record=$xml_bio->xpath('/data/record');$count_a = count($xml_bio_record);echo '<br>$count_a is...'.$count_a.'<br>';//foreach($xml_bio_record as $xa){    echo "Found {$xa->status} <br>";}$xml_bio_record=$xml_bio->xpath('//record[@id="1A"]');$count_b = count($xml_bio_record);echo '<br>$count_b is...'.$count_b.'<br>';//foreach($xml_bio_record as $xb){    echo "Found {$xb->status} <br>";}======== 作为对此的补充,如果我希望将一个变量设置为等于$xb->xpath('./congrant[status="Funded"]'),例如:$xml_congrant_congrant_children=$xb->xpath('./congrant[status="Funded"]')然后在分页场景中使用索引来循环资助结果,那如何实现?例如for ($i = $offset; $i < ($offset + $per_page); $i++) { $strCongrant_ident = $xml_congrant_congrant_children[$i]['ident'];} 我之前在分页设置中使用过这个循环想法,但是让过滤器应用于此处的变量不起作用。感谢您提供任何线索。
查看完整描述

2 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

正如supputuri 的回答所暗示的那样,您可以将两个 XPath 表达式组合到一个搜索中:


//record[@id="1A"]/congrant[status="Funded"]

如果你想要第一个列表用于其他目的,你可以循环它并在 PHP 中进行状态检查:


$xml_bio_record=$xml_bio->xpath('//record[@id="1A"]');

$funded_count = 0;

foreach($xml_bio_record as $xb){

    foreach ($xb->congrant as $congrant) {

        if ( (string)$congrant->status == 'Funded' ) {

            $funded_count++;

        }

    }

}

或者您可以混合使用循环和 XPath,.用于使 XPath 搜索相对于特定元素:


$xml_bio_record=$xml_bio->xpath('//record[@id="1A"]');

$total_funded_count = 0;

foreach($xml_bio_record as $xb){

    $xb_funded_count = count($xb->xpath('./congrant[status="Funded"]'));

    $total_funded_count += $xb_funded_count;

}


查看完整回答
反对 回复 2021-10-22
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

这是可用于获取具有Funded状态的元素计数的纯 xpath 。

count(//record[@id="1A"]//status[.='Funded'])

截屏:

//img1.sycdn.imooc.com//61727c5e0001eb4004580823.jpg

查看完整回答
反对 回复 2021-10-22
  • 2 回答
  • 0 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信