PHP 从子节点中提取 getElementsByTagName

PHP extracting getElementsByTagName from childNodes

这应该是非常直接的,但由于某种原因,它正在逃避我。

使用从文件导入的以下 XML 结构:

<locations>
  <devices>
    <entry>
      <serial>12345</serial>
      <hostname>FooBarA</hostname>
      <vsys>
        <entry>
          <displayname>CorpA</displayName>
          <tag>InternalA</tag>
        </entry>
      </vsys>
      </c>
    </entry>
    <entry>
      <serial>123456</serial>
      <hostname>FooBarB</hostname>
      <vsys>
        <entry>
          <displayname>CorpB</displayName>
          <tag>InternalB</tag>
        </entry>
      </vsys>
      </c>
    </entry>
  </devices>
</locations>

并且提取 Parent 应该是直截了当的:

$devices = $dom->getElementsByTagName('devices');
$data = array();
foreach($devices as $node){  // each $node = <devices> == only ONE object
  foreach($node->childNodes as $child) {  // each $child is the ENTIRE <entry>, including <entry> tag
    // I would expect this to return the <serial> out of parent <entry>, but its not
    $serial = $child->getElementsByTagName('serial') ;
    echo "\n" . $count++ . ", a" .$serial->nodeName ;    
    if ($child->nodeName == "entry") {
      // as a secondary method, I then try to extra <serial> looping through the childNodes of the parent <entry> and again, this doesn't work.
      foreach ($child->childNodes as $kid) {
        $serial = $kid->getElementsByTagName('serial') ;
        echo ", b" .$serial->nodeName ;
      }
    }
  }
}

以上打印出来:

1a, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b
2a, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b
3a, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b
4a, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b

我的实际 xml 文件在 serial 级别有更多的兄弟姐妹,因此它打印出所有额外的 bs...因此这告诉我基本的 foreach's正在工作并且每个都正确循环通过每个级别 - 但我无法在每个级别中提取 nodeName 或 getElementsByTagName。

我想这两种方法中的一种,在不同的嵌套级别,会提取 <serial> 但两者都不起作用。我在这里错过了什么?

我的期望是它会打印:

1a 12345, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b
2a 123456, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b
3a 1234567, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b
4a 12345678, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b

或者至少:

1a, b 12345, b 12345, b 12345 ...
2a, b 123456, b 123456, b 123456 ...
3a, b 1234567, b 1234567, b 1234567 ...
etc etc.

getElementsByTagNamereturns一个DOMNodeList,所以你需要迭代它来获取各个节点的名称:

$serials = $child->getElementsByTagName('serial') ;
foreach($serials as $serial) {
  echo "\n" . $count++ . ", a" .$serial->nodeName ;    
}

作为旁节点,问题中的xml无效:

  • <displayname> ... </displayName>
  • <vsys> <entry> ... </entry> </c>