【问题标题】:PHP and XML: Iterate an XML's leaf elementsPHP 和 XML:迭代 XML 的叶元素
【发布时间】:2015-09-09 11:41:48
【问题描述】:

我希望在XML 文件中提取叶节点的父节点,使用php

<root>
     <level name="level1">
       <content name="c1/>
     </level>
     <level name="level2>
       <level name="sub-level-2a">
          <content name="c2" />
       </level>

       <level name="sub-level-2b">
          <level name="sub-sub-level-2b">
             <content name="c3" />
          </level>
       </level>
     </level>
</root>

所以在上面的 XML 中,叶子可以有几个层次的深度,考虑叶子的元素是:

<content name="c1" />
<content name="c2" />
<content name="c3" />`

如何提取上述每个叶子父母的name属性,并为每个叶子输出:&lt;leaf-name-attribute&gt; - &lt;parent-name-attribute&gt;

我试过了:

$content_node_parents = $xml->xpath('//content/parent::*');

foreach ($content_node_parents as $content_node_parent) 
{
  echo $content_node_parent['name']." - ".$content_node_parent->content['name']."\n";             
}`

上面的工作完全没问题,但只有&lt;content&gt; 不是叶子的元素也被提取了

【问题讨论】:

  • 你尝试了什么?结果你到底想要什么?你指的是离开和父母,但你的例子有内容和父母节点。
  • 对于每个&lt;content&gt;,我希望在&lt;level&gt; 中拥有其父级的name 属性。
  • 作为一般策略,通过 xpath 选择所有内容节点,遍历它们,检索它们的 name-attribute 和 xpath 以检索其父属性。随时分享您的代码和结果并完善您的问题。

标签: php xml


【解决方案1】:

使用 xpath 选择需要的值

//*[*[not(descendant::*)]]/@name | //*[not(descendant::*)]/@name

返回

Attribute='name="level1"'
Attribute='name="c1"'
Attribute='name="sub-level-2a"'
Attribute='name="c2"'
Attribute='name="sub-sub-level-2b"'
Attribute='name="c3"'

【讨论】:

  • 谢谢,但是否也可以提取每个父母的姓名属性?
  • 例如://*[*[not(descendant::*)]]/@name | //*[not(descendant::*)]/@name
  • 以上可以完成这项工作,但您认为您可以修改您的答案以显示如何为每个叶子输出:&lt;parent-name&gt; to &lt;leaf-name&gt;。这正是我正在寻找的。​​span>
  • 在 xpath 1.0 中绝对没有
  • @splash58 在我看来像是一个“请写我的代码”问题,你不觉得吗?
猜你喜欢
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 2011-05-28
相关资源
最近更新 更多