XPath:根据父属性获取子值

时间:2014-01-29 14:29:06

标签: php xml xpath

假设XML具有以下结构:

<A>
  <B>
    <C>
      <D name='title1'>
        <E>
          <F data='d1'>ON</F>
        </E>
      </D>
      <D name='title2'>
        <E>
          <F data='d12'>ON</F>
        </E>
      </D>
    </C>
  </B>
</A>

如何根据“D”节点属性获得“F”节点输出? 有点像这样:

/A/B/C/D[@name='title1']/E/F

我可以根据其属性使用以下内容获取F节点:

$status = $lol->xpath("//n:F[@data='d1']");
echo "Status: " . $status[0] . "</br>";

我厌倦了将xpath的变体放到我想要的东西上,但没有运气。

想法?

3 个答案:

答案 0 :(得分:1)

//D[@name='title1']//F

会给你<F data='d1'>ON</F>

//D[@name='title2']//F

应该给你<F data='d12'>ON</F>

答案 1 :(得分:1)

您的意思是“根据父D属性查找所有F?”

以下是“查找所有具有D-parent-node且'title'属性等于'title1'的F节点的示例:

$xml = <<<XML
<A>
  <B>
    <C>
      <D name='title1'>
        <E>
          <F data='d1'>ON</F>
        </E>
      </D>
      <D name='title1'>
        <E>
          <F data='d12'>ON</F>
        </E>
      </D>
    </C>
  </B>
</A>
XML;

$oXml = new SimpleXmlElement($xml);

var_dump($oXml->xpath("//D[@name='title1']//F"));

我希望这会对你有所帮助。

答案 2 :(得分:0)

我喜欢处理类型的XML文档的一种很简单的方法,类似于您尝试的$status[0],就像这样:

working example

$status = $xml->xpath("//D");

echo $status[0]['name'] . " is " . $status[0]->E->F .  "\r\n";
echo $status[1]['name'] . " is " . $status[1]->E->F . "\r\n";

输出:

title1 is ON
title2 is ON