首页 文章

使用DOMXPath用XPath表达式替换foreach循环

提问于
浏览
0

我想使用xpath表达式替换foreach循环,但我需要一个DOMXPath对象来返回多个列表 .

我有以下XML(简化),我使用DOMDocumentDOMXPath迭代它:

<a:RoomsType>
    <a:Rooms>
      <a:Room>
          <a:RPH>0</a:RPH>
      </a:Room>
      <a:Room>
          <a:RPH>1</a:RPH>
      </a:Room>
      <a:Room>
          <a:RPH>2</a:RPH>
      </a:Room>
      <a:Room>
          <a:RPH>0</a:RPH>
      </a:Room>
    <a:Rooms>
<a:RoomsType>

我想用RPH号码拆分房间,为每个RPH号码创建一个房间列表 . 目前,我正在使用以下代码:

//$xpath is a DOMXPath object
 $roomsToIterate = $this->xpath->query("//a:RoomsType/a:Rooms/a:Room");

 $roomList = array();
 foreach ($roomsToIterate as $room) {
     $rphCandidate = $room->getElementsByTagName("RPH")->item(0)->nodeValue;
     if (!isset($roomList[$rphCandidate])) {
         $roomList[$rphCandidate] = array();
     }
     $roomList[$rphCandidate][] = $room;
 }

这现在有效,但我想用Xpath表达式替换foreach循环 . 我可以使用 $rooms = $this->xpath->query("//a:RoomsType/a:Rooms/a:Room[a:RPH='{$rph}']"); 表达式,其中 $rph 是一个数字,但是如果我不知道RPH(它可以是0到99之间的任何值),我该怎么办呢 . 可能吗?

简而言之,有没有办法用XPath替换我的foreach循环?

我在考虑使用registerPhpFunctions和自定义函数,但是我关注这种方法与foreach循环相比的性能

1 回答

  • 1

    Xpath 1.0表达式将返回一个节点列表,如果使用像 descendantancestor 这样的轴,它们可以在某种程度上展平现有结构,但它将是一个节点列表 . 它不能分组或聚合它们 .

    您可以获取具有特定 RPH 值的节点列表 . 但是你需要对每个值进行此操作,结果将是另一个循环 . 这意味着获取所有 RPH 值,使它们唯一,迭代它们并执行每个值的Xpath表达式 .

    你目前的解决方案很好 .

相关问题