我想让一个节点内的所有孩子和孩子(基本上所有的东西)都知道,而不知道嵌套节点有多深。我可以使用循环,但我不确定是否有一个本机函数可以一次性为我检索所有这些数据。
谢谢我在php中使用simplexml_load_file()
答案 0 :(得分:1)
提供SimpleXMLElement对象的所有节点的递归迭代。
$xml = <<< XML
<node id="l-1">
<node id="l-1-1">
<node id="l-1-1-1">
<node id="l-1-1-1-1"/>
</node>
</node>
<node id="l-1-2">
<node id="l-1-2-1">
<node id="l-1-2-1-1"/>
<node id="l-1-2-1-2"/>
</node>
</node>
</node>
XML;
$xmlIterator = new RecursiveIteratorIterator(
new SimpleXMLIterator($xml),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($xmlIterator as $nodeName => $node) {
echo $nodeName, $node['id'], PHP_EOL;
}
将输出(demo)
nodel-1-1
nodel-1-1-1
nodel-1-1-1-1
nodel-1-2
nodel-1-2-1
nodel-1-2-1-1
nodel-1-2-1-2
答案 1 :(得分:0)
如果你想坚持使用SimpleXML,正如你在the documentation中看到的那样,只有get direct children的方法。要获得嵌套的子代,你必须遍历这些并查找它们 - 就像你在文档中看到的Exampe #1
一样:
$xml = new SimpleXMLElement(
'<person>
<child role="son">
<child role="daughter"/>
</child>
<child role="daughter">
<child role="son">
<child role="son"/>
</child>
</child>
</person>');
foreach ($xml->children() as $second_gen) {
echo ' The person begot a ' . $second_gen['role'];
foreach ($second_gen->children() as $third_gen) {
echo ' who begot a ' . $third_gen['role'] . ';';
foreach ($third_gen->children() as $fourth_gen) {
echo ' and that ' . $third_gen['role'] .
' begot a ' . $fourth_gen['role'];
}
}
}
答案 2 :(得分:0)
尝试使用,您可能需要编辑
<?
$xmlfile="test.xml";
$reader = new XMLReader();
$reader->open($xmlfile);
while ($reader->read()) {
if($reader->nodeType == XMLReader::ELEMENT){
echo "<br><b>Element:</b>".$reader->name;
}
if($reader->nodeType == XMLReader::TEXT){
echo " <b>Text:</b>".$reader->value;
}
if($reader->hasAttributes){
$reader->moveToNextAttribute();
echo " <b>Attribute:</b>".$reader->name." <b>value:</b>".$reader->value;
$reader->read();
$reader->read();
}
}
?>