PHP XML使用命名空间从父级获取子变量

时间:2018-02-12 09:08:07

标签: php xml namespaces

如何从以下xml标记中获取 a b c d e ...

<api:field name="test">
    <api:text>a</api:text>
    <api:text>b</api:text>
    <api:text>c</api:text>
    <api:text>d</api:text>
    <api:text>e</api:text>
</api:field>

我正在尝试将此用于循环:

foreach ($xml->xpath('//api:field[@name="test"]') as $item)
{
    foreach ($item->children() as $child) {
        ...
    }
}

但我不知道如何访问不包含任何属性的子节点。

我需要专门为父节点“test”获取子值,所以请不要给我 $ xml-&gt; xpath(“// api:text”); 作为回答。这个答案的问题是我们可能会在其他父节点下看到 ,我只想从特定父节点获取子值。在这种情况下, name =“test”

1 个答案:

答案 0 :(得分:1)

有几种方法可以实现这一目标。要么只是扩展xpath表达式以返回子节点本身:

foreach ($sxml->xpath('/api:field[@name="test"]/api:text') as $item) {
    echo (string) $item, PHP_EOL;
}

或者,如果你确实想要使用两个循环(或者它更适合你的用例),你只需要将命名空间前缀传递给children()方法:

foreach ($sxml->xpath('/api:field[@name="test"]') as $item) {
    foreach ($item->children('api', true) as $child) {
        echo (string) $child, PHP_EOL;
    }
}

(如果命名空间前缀可能会更改,您可以使用registerXPathNamespace方法根据定义的命名空间URL注册持久性前缀。)

这两种方法都会产生相同的结果:

  

一个
  b
  ç
  d
  ë

有关完整示例,请参阅https://eval.in/954569