Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何以递归格式显示xml数据以显示数据的真实子/父关系_Php_Xml_Recursion_Multidimensional Array_Treeview - Fatal编程技术网

Php 如何以递归格式显示xml数据以显示数据的真实子/父关系

Php 如何以递归格式显示xml数据以显示数据的真实子/父关系,php,xml,recursion,multidimensional-array,treeview,Php,Xml,Recursion,Multidimensional Array,Treeview,我试图以树格式显示XML源中的数据,以显示正确的父->子关系 问题是子节点本身可以有多个子节点(没有限制) 在闪存中工作的输出示例= 但是,我无法在PHP/html中复制这一点。 我在这里提供了一个示例XML源: 在其他人的帮助下,家长ID及其子女的列表如下: <?php $content = file_get_contents('http://www.fluffyduck.com.au/sampleXML.txt'); $xml = new SimpleXMLElement($cont

我试图以树格式显示XML源中的数据,以显示正确的父->子关系

问题是子节点本身可以有多个子节点(没有限制)

在闪存中工作的输出示例=

但是,我无法在PHP/html中复制这一点。 我在这里提供了一个示例XML源:

在其他人的帮助下,家长ID及其子女的列表如下:

<?php

$content = file_get_contents('http://www.fluffyduck.com.au/sampleXML.txt');
$xml = new SimpleXMLElement($content);

$users = array ();
myUserReader($xml->user, $users);

function myUserReader($node, &$users)
{
    if (array_key_exists("{$node['id']}", $users) === false)
    {
        $users["{$node['id']}"] = array ();
    }
    if (isset($node->user))
    {
        for ($key = 0; ($key < count($node->user)); $key++)
        {
            $user = $node->user[$key];
            if (!in_array("{$node['id']}", $users["{$node['id']}"]))
            {
                $users["{$node['id']}"][] = "{$user['id']}";
#                $users["{$node['id']}"][] = $user;
            }
            myUserReader($user, $users);
        }
    }
}

foreach ($users as $parent => $children)
{
    echo "{$parent}: " . implode(", ", $children) . "\n";
}
?>
用户,$users);
函数myUserReader($node,&$users)
{
如果(array_key_存在(“{$node['id']},$users)==false)
{
$users[“{$node['id']}”]=array();
}
if(isset($node->user))
{
对于($key=0;($keyuser));$key++)
{
$user=$node->user[$key];
如果(!在数组(“{$node['id']},$users[“{$node['id']}]”)中)
{
$users[“{$node['id']}”][]=“{$user['id']}”;
#$users[“{$node['id']}”][]=$user;
}
myUserReader($user,$users);
}
}
}
foreach($parent=>$children的用户)
{
echo“{$parent}:”.introde(“,”,$children)。“\n”;
}
?>
我无法计算出我需要什么代码来解析上述结果,并按照上面所附的图片显示信息

我曾考虑将XML转换为数组,但仍然有同样的问题,我尝试过的代码是:

function xmlstr_to_array($xmlstr) {
  $doc = new DOMDocument();
  $doc->loadXML($xmlstr);
  return domnode_to_array($doc->documentElement);
}
function domnode_to_array($node) {
  $output = array();
  switch ($node->nodeType) {
   case XML_CDATA_SECTION_NODE:
   case XML_TEXT_NODE:
    $output = trim($node->textContent);
   break;
   case XML_ELEMENT_NODE:
    for ($i=0, $m=$node->childNodes->length; $i<$m; $i++) {
     $child = $node->childNodes->item($i);
     $v = domnode_to_array($child);
     if(isset($child->tagName)) {
       $t = $child->tagName;
       if(!isset($output[$t])) {
        $output[$t] = array();
       }
       $output[$t][] = $v;
     }
     elseif($v) {
      $output = (string) $v;
     }
    }
    if(is_array($output)) {
     if($node->attributes->length) {
      $a = array();
      foreach($node->attributes as $attrName => $attrNode) {
       $a[$attrName] = (string) $attrNode->value;
      }
      $output['@attributes'] = $a;
     }
     foreach ($output as $t => $v) {
      if(is_array($v) && count($v)==1 && $t!='@attributes') {
       $output[$t] = $v[0];
      }
     }
    }
   break;
  }
  return $output;
}

$moo = xmlstr_to_array($content);
print_r($moo);
函数xmlstr到数组($xmlstr){ $doc=新的DOMDocument(); $doc->loadXML($xmlstr); 将domnode_返回到_数组($doc->documentElement); } 函数domnode_到_数组($node){ $output=array(); 开关($node->nodeType){ 案例XML\U CDATA\U节\U节点: 案例XML_文本_节点: $output=trim($node->textContent); 打破 案例XML_元素_节点: 对于($i=0,$m=$node->childNodes->length;$ichildNodes->item($i); $v=domnode_到_数组($child); if(isset($child->tagName)){ $t=$child->tagName; 如果(!isset($output[$t])){ $output[$t]=array(); } $output[$t][]=$v; } 埃尔塞伊夫(五美元){ $output=(字符串)$v; } } if(is_数组($output)){ 如果($node->attributes->length){ $a=数组(); foreach($node->属性为$attrName=>$attrNode){ $a[$attrName]=(字符串)$attrNode->value; } $output['@attributes']=$a; } foreach($t=>v的输出){ if(is_数组($v)&&count($v)==1&&$t!='@attributes')){ $output[$t]=$v[0]; } } } 打破 } 返回$output; } $moo=xmlstr_到_数组($content); 印刷费($moo); 但是,同样的问题也存在,我不知道如何循环并以正确的父->子方式递归地显示信息

由于数据的构造方式,我也无法确定如何检索“单个”条目,如果我可以这样做,也许我可以手动重建树,我不确定如何进行,因为每个记录都没有唯一的标识符


非常感谢您的帮助。

在本例中,最好避免使用DOM或SimpleXML,而是使用XSLT,因为XSLT是为处理递归而设计的。创建样式表,如下所示:

$xslt=new SimpleXMLElement('<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:template match="*">
       <ul>
            <li><xsl:value-of select="local-name()"/>
             <xsl:apply-templates/>
            </li>
       </ul>
    </xsl:template>
</xsl:stylesheet>');

这只是一个简单的例子,但它应该生成一个长而无序的列表,其中包含正确嵌套的所有父级及其子级。修改“value of”指令以拉出您可能更愿意显示的属性等。

对此进行了一次尝试,但收到:致命错误:调用成员函数transformToXML()在非对象上…您输入的代码与transformToXML的php文档是内联的,所以我不确定这个问题,除了它使用DOM,并且您在我的代码中列出了simplexmlTypo…请参见第二个代码块最后一行上方的编辑)。
$content = file_get_contents('http://www.fluffyduck.com.au/sampleXML.txt'); 
$xml = new SimpleXMLElement($content); 
$xsl_processor = new XSLTProcessor(); 
$xsl_processor->importStylesheet($xslt); 
echo $xsl_processor->transformToXml($xml);