0

正しい親->子の関係を表示するために、データをツリー形式でXMLソースで表示しようとしています。

問題は、子ノードが複数の子を持つことができることです(制限はありません)

フラッシュで機能する出力の例= http://fluffyduck.com.au/example-layout.jpg

ただし、これをPHP/htmlで複製することはできません。ここにサンプルのXMLソースを提供しました:http ://www.fluffyduck.com.au/sampleXML.txt

他の何人かの人々の助けを借りて、次のように、親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);

ただし、同じ問題が存在します。正しい親->子の方法で情報を再帰的に循環して表示する方法がわかりません。

データの構築方法が原因で、「単一の」エントリを取得する方法もわかりません。それができれば、手動でツリーを再構築できる可能性があります。各レコードに一意のレコードがないため、方法がわかりません。識別子。

どんな助けでも大歓迎です。

4

1 に答える 1

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」ディレクティブを変更して、代わりに表示できる属性などを引き出します。

于 2012-09-18T06:55:35.000 に答える