1

这一切都应该非常直截了当,但由于某种原因它正在逃避我。

使用从文件导入的以下 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因此它打印出所有额外b的 s...因此这告诉我基本的 foreach 正在工作并且每个都正确循环通过每个级别 - 但我无法提取每个级别内的 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.
4

1 回答 1

1

getElementsByTagName返回一个DOMNodeList,因此您需要对其进行迭代以获取各个节点的名称:

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

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

  • <displayname> ... </displayName>
  • <vsys> <entry> ... </entry> </c>
于 2017-04-26T13:01:48.983 回答