【问题标题】:How to display xml data in recursive format to show true child/parent relationships from data如何以递归格式显示 xml 数据以显示数据中的真实子/父关系
【发布时间】:2012-09-18 06:25:21
【问题描述】:

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

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

在闪存中工作的输出示例 = http://fluffyduck.com.au/example-layout.jpg

但是,我无法在 PHP / html 中复制它。 我在这里提供了一个示例 XML 源:http://www.fluffyduck.com.au/sampleXML.txt

在其他人的帮助下,父 ID 及其子 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";
}
?>

我无法计算出我需要什么代码来解析上述结果并按照上面所附的图像显示信息。

我曾考虑将 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);

然而同样的问题存在,我不知道如何以正确的Parent -> Child方式递归循环并显示信息。

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

非常感谢任何帮助。

【问题讨论】:

    标签: php xml recursion multidimensional-array treeview


    【解决方案1】:

    在这种情况下可能会更好地避免使用 DOM 或 SimpleXML,而是使用 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>');
    

    然后使用 PHP 的内置 XSL 库对其进行转换(请注意,某些机器可能已将 PHP 编译为没有内置此功能,但很可能是这样):

    $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);
    

    这只是一个简单的例子,但它应该生成一个长的、无序列的所有父母和他们的孩子的列表,正确嵌套。修改“value-of”指令以提取您可能宁愿显示的属性等。

    【讨论】:

    • 试一试,但收到:致命错误:在非对象上调用成员函数 transformToXML() ...您输入的代码与 transformToXML 的 php 文档内联,所以我'我不确定这个问题,除了它使用 DOM 并且您列出了 simplexml
    • 我的代码中的错字...请参阅上面第二个代码块最后一行的编辑)。
    猜你喜欢
    • 2017-08-29
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多