使用SimpleXML的XPath来筛选基于PHP中值节点(Using Simplexml'

2019-10-29 07:14发布

我工作的一种方式来筛选基于它们在PHP值某些节点。 我试图返回平等地位节点的计数,“三资”。 我不知道有关的部分是在使用数组(以前的过滤器的结果($ xml_bio_record [0])在新的过滤器(xml_bio_children $))。
此代码不为$ count_c返回一个计数。 如何将我的状态筛选=“三资”? 感谢您的任何线索。

下面是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>";
}



$xml_bio_children=$xml_bio_record[0]->xpath('/congrant[status="Funded"]');

$count_c = count($xml_bio_children);
echo '<br>$count_c is...'.$count_c.'<br>';//
foreach($xml_bio_children as $xc){
    echo "Found {$xc->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'];
} 

我在一个分页设置前,用这个循环的想法,但得到的过滤器适用于这里的变量是行不通的。 感谢您的任何线索。

Answer 1:

这里是纯粹的XPath,你可以用它来获得与元素的个数Funded状况。

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

截图:



Answer 2:

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


文章来源: Using Simplexml's Xpath to filter nodes based upon value in PHP