我正在从一个 XML 文件中实现一个 PHP 站点地图解析器。我做得比较好。但是,我需要解析器更加动态。我需要实现一个递归函数 will 继续为找到的每个 child_node 循环。一个节点可以在另一个子节点中包含许多子节点。到目前为止,我所做的是为每个 child_node 实现一个具有不同变量名的单独 foreach 循环,但是这是 Not Acceptable ,因为它不那么灵活。
这是我的 xml 文件:
<sitemap>
<node>
<id>rootnode</id>
<link>home.html</link>
</node>
<node>
<id>about</id>
<link>about.html</link>
</node>
<node>
<id>contact</id>
<link>contact.html</link>
<child_node>
<id>contact_uk</id>
<link>contact_uk.html</link>
<child_node>
<id>customer_support_uk</id>
<link>customer_support_uk.html</link>
</child_node>
</child_node>
<child_node>
<id>contact_usa</id>
<link>contact_usa.html</link>
</child_node>
</node>
<node>
<id>products</id>
<link>products.html</link>
</node>
</sitemap>
您可以注意到节点联系人在 child_node 中有一个 child_node。这是我需要递归函数的地方。
这是我当前的 PHP 代码:
$source = 'sitemap.xml';
// load as file
$sitemap = simplexml_load_file($source, null, true);
foreach ($sitemap->node as $node) {
if ($node->child_node != "") {
echo "$node->link<br/>";
foreach ($node->child_node as $child) {
if ($child->child_node != "") {
echo " " . $child->link . "<br/>";
foreach ($child->child_node as $innerchild) {
echo " " . $innerchild->link . "<br/>";
}
} else {
echo " " . $child->link . "<br/>";
}
}
} else {
echo "$node->link<br/>";
}
}
此 PHP 具有正确的输出,但我必须为其父 child_node 中的每个 child_node 创建另一个单独的 foreach 循环。有人可以指出正确的方向,告诉我如何更改我的 PHP 代码,以便遍历站点地图中找到的 child_node 中的每个 child_node 吗?
非常感谢!
最佳答案
未测试...但应该可以:
function print_node($node, $level){
echo str_repeat("-",$level);
echo "$node->link\n";
if ($node->child_node != "") {
foreach ($node->child_node as $child) {
print_node($child,$level+1);
}
}
}
$source = 'sitemap.xml';
$sitemap = simplexml_load_file($source, null, true);
foreach ($sitemap->node as $node)
print_node($node,0);
关于php - 使用 PHP 解析 XML 导航站点地图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5043654/