首页 文章

php xpath基于多个属性和父属性检索属性值

提问于
浏览
1

我需要从xml中选择节点,条件见下文 . 我使用的是simplexml,因此xpath必须为1.0 .

XML片段:

<scales>
    <scale id="1" gender="*" age="*">
        <d scid="hi" raw="10" t="76" />
        <d scid="pn" raw="12" t="80" />
    </scale>
    <scale id="2" gender="m" age="*">
        <d scid="hi" raw="8" t="79" />
        <d scid="pn" raw="2" t="50" />
    </scale>
    <scale id="3" gender="*" age="19-39">
        <d scid="hi" raw="0" t="48" />
        <d scid="pn" raw="10" t="49" />
    </scale>
</scales>

现在,我想选择具有...的 <d> 节点的 t -Attribute .

raw="10" AND scid="hi"

 $result=$xml->xpath('//d[@scid="hi"][@raw="10"]/@t');

它的父节点 <scale> 有......

(gender="*" OR gender="m") AND (age="*" OR age="39-59")

$result=$xml->xpath('//scale[@gender="*" or @gender="m"][@age="*" or @age="39-59"]');

我想从我的simplexml-object $xml 获得1 xpath语句 .

2 回答

  • 0

    只需结合您的两个XPath查询...

    Live demo

    $str=<<<XML
    <scales>
        <scale id="1" gender="*" age="*">
            <d scid="hi" raw="10" t="76" />
            <d scid="pn" raw="12" t="80" />
        </scale>
        <scale id="2" gender="m" age="*">
            <d scid="hi" raw="8" t="79" />
            <d scid="pn" raw="2" t="50" />
        </scale>
        <scale id="3" gender="*" age="19-39">
            <d scid="hi" raw="0" t="48" />
            <d scid="pn" raw="10" t="49" />
        </scale>
    </scales>
    XML;
    $xml=simplexml_load_string($str);
    foreach($xml->xpath('//scale[@gender="*" or @gender="m"][@age="*" or @age="39-59"]/d[@scid="hi"][@raw="10"]/@t') as $t)
    {
        echo $t;
    }
    

    输出 76 .

  • 4

    好快速读入xpath似乎你可以做属性匹配这样的事情

    $path = "(scale[@gender=\"*\"]|scale[@gender=\"m\"]) & (scale[@age=\"*\"]|scale[@age=\"39-59\"])";
     $scale= $xml->xpath($path);
    

    这应该返回您想要的实际比例标记 . 然后你可以在返回的$ scale中循环遍历标签,并使用类似的东西拉出标准属性(注意不准确但正确的概念)

    foreach($scale->d[0]->attributes() as $a => $b => $c) {
        echo "t=$c\"\n";
    }
    

相关问题