首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于初始上下文选择节点

基于初始上下文选择节点
EN

Stack Overflow用户
提问于 2020-09-14 18:07:47
回答 1查看 31关注 0票数 2

我有一个结构如下的XML文件:

代码语言:javascript
复制
<r>
  <a>
    <i>
      <k>1</k>
      <d>d1</d>
    </i>
    <i>
      <k>3</k>
      <d>d3</d>
    </i>
  </a>
  <b>
    <i>
      <k>1</k>
      <d>rd1</d>
    </i>
    <i>
      <k>2</k>
      <d>id2</d>
    </i>
    <i>
      <k>3</k>
      <d>rd3</d>
    </i>
  </b>
</r>

我选择/r/a下的i节点并遍历它们,以查找/r/b下的关联节点,并检索它们的d节点的值,如下所示:

代码语言:javascript
复制
$data = [];
$nodes = $domXPath->evaluate('/r/a/i');
foreach($nodes as $node) {
   $key = $domXPath->evaluate('string(k)', $node);
   $data[] = $domXpath->evaluate("string(/r/b/i[k=$key]/d)", $node);
}

这会在$data中产生正确的结果

代码语言:javascript
复制
[
  "rd1",
  "rd3",
]

我的问题是,是否有可能在不拔出PHP键的情况下做到这一点,例如:

代码语言:javascript
复制
$data = [];
$nodes = $domXPath->evaluate('/r/a/i');
foreach($nodes as $node) {
   $data[] = $domXpath->evaluate("string(/r/b/i[k=initial-context()/k]/d)", $node);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-14 18:29:48

您可以使用单个XPath来完成此操作:

代码语言:javascript
复制
$nodes = $domXPath->evaluate('/r/b/i[k = /r/a/i/k]/d');
foreach($nodes as $node) $data[] = $node->textContent;

表达式表示,对于每个/r/b/i节点,仅当其k节点与/r/a/i下的相应k节点匹配时才允许。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63882220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档