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
级别有更多的兄弟姐妹,因此它打印出所有额外的 b
s...因此这告诉我基本的 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.
getElementsByTagName
returns一个DOMNodeList,所以你需要迭代它来获取各个节点的名称:
$serials = $child->getElementsByTagName('serial') ;
foreach($serials as $serial) {
echo "\n" . $count++ . ", a" .$serial->nodeName ;
}
作为旁节点,问题中的xml无效:
<displayname> ... </displayName>
<vsys> <entry> ... </entry> </c>
这应该是非常直接的,但由于某种原因,它正在逃避我。
使用从文件导入的以下 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'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.
getElementsByTagName
returns一个DOMNodeList,所以你需要迭代它来获取各个节点的名称:
$serials = $child->getElementsByTagName('serial') ;
foreach($serials as $serial) {
echo "\n" . $count++ . ", a" .$serial->nodeName ;
}
作为旁节点,问题中的xml无效:
<displayname> ... </displayName>
<vsys> <entry> ... </entry> </c>