猿问

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

我正在研究一种根据某些节点在 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'];

我之前在分页设置中使用过这个循环想法,但是让过滤器应用于此处的变量不起作用。感谢您提供任何线索。


烙印99
浏览 160回答 2
2回答

FFIVE

正如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){&nbsp; &nbsp; foreach ($xb->congrant as $congrant) {&nbsp; &nbsp; &nbsp; &nbsp; if ( (string)$congrant->status == 'Funded' ) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $funded_count++;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}或者您可以混合使用循环和 XPath,.用于使 XPath 搜索相对于特定元素:$xml_bio_record=$xml_bio->xpath('//record[@id="1A"]');$total_funded_count = 0;foreach($xml_bio_record as $xb){&nbsp; &nbsp; $xb_funded_count = count($xb->xpath('./congrant[status="Funded"]'));&nbsp; &nbsp; $total_funded_count += $xb_funded_count;}

一只名叫tom的猫

这是可用于获取具有Funded状态的元素计数的纯 xpath&nbsp;。count(//record[@id="1A"]//status[.='Funded'])截屏:
随时随地看视频慕课网APP
我要回答