用PHP解析XML导航站点地图
我正在从一个XML文件实现一个PHP站点地图解析器。我做得比较好。但是,我需要解析器更具动态性。我需要实现一个递归函数,它将继续为找到的每个子节点循环。一个节点可以在另一个子节点中包含多个子节点。到目前为止,我所做的是为每个子节点实现一个单独的foreach循环,每个子节点使用不同的变量名,但是这是不可接受的,因为它不是那么灵活 这是我的xml文件:用PHP解析XML导航站点地图,php,xml,sitemap,Php,Xml,Sitemap,我正在从一个XML文件实现一个PHP站点地图解析器。我做得比较好。但是,我需要解析器更具动态性。我需要实现一个递归函数,它将继续为找到的每个子节点循环。一个节点可以在另一个子节点中包含多个子节点。到目前为止,我所做的是为每个子节点实现一个单独的foreach循环,每个子节点使用不同的变量名,但是这是不可接受的,因为它不是那么灵活 这是我的xml文件: <sitemap> <node> <id>rootnode</id>
<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>
根节点
home.html
关于
关于.html
接触
contact.html
联络英国
联系_uk.html
客户支持英国
客户支持网站www.customer\u support\u uk.html
联系美国
联系_usa.html
产品
products.html
您可以注意到,节点联系人在子节点中有一个子节点。这就是我需要递归函数的地方
这是我当前的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/>";
}
}
$source='sitemap.xml';
//加载为文件
$sitemap=simplexml\u load\u文件($source,null,true);
foreach($sitemap->node as$node){
如果($node->child_node!=“”){
回显“$node->link
”;
foreach($node->child\u节点作为$child){
如果($child->child\u节点!=“”){
回显“$child->link”。
;
foreach($child->child\u节点作为$innerchild){
回显“$innerchild->link”。
;
}
}否则{
回显“$child->link”。
;
}
}
}否则{
回显“$node->link
”;
}
}
这个PHP有正确的输出,但我必须为其父child_节点中的每个child_节点创建另一个单独的foreach循环。有人能告诉我如何更改我的PHP代码,以便遍历站点地图中的子节点中的每个子节点吗
非常感谢 您需要一个递归函数,并在处理每个顶级节点时调用它
function processChildren( $node )
{
foreach( $node->child_node as $child )
{
echo "$child->link<br/>";
if( count( $child->child_node ) )
{
processChildren( $child );
}
}
}
函数processChildren($node)
{
foreach($node->child\u节点作为$child)
{
回显“$child->link
”;
if(计数($child->child\u节点))
{
儿童(儿童);
}
}
}
我将作为一个有趣的练习留给读者如何使缩进工作。;-) 未测试…但应能工作:
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);
这些嵌套的子节点可以有多深?如果它是无限制的,您可能希望使用递归函数。否则,如果只有两个级别,那么嵌套循环将是最简单的。它可以深入到很深的层次。在上面的例子中,它只是一个孩子在另一个孩子里面。然而,在现实中,它将深入(10或更多)。我不太擅长递归函数。我知道这就是我需要的。你能帮忙吗?谢谢