📄 xmltree.php
字号:
<?php
class tree
{
var $FILE_SORT;
var $file = "display.xml";
var $fontSize = -1;
var $expandAll = 0;
var $imgPath = "treeicon/";
var $imgType = array
(
"leaf" => "t_leaf.gif",
"tplus" => "t_tplus.gif",
"cplus" => "t_cplus.gif",
"tminus" => "t_tminus.gif",
"cminus" => "t_cminus.gif",
"mbar" => "t_bar.gif",
"mtee" => "t_tee.gif",
"mcorner" => "t_c.gif",
"mspace" => "t_dot.gif",
"audio" => "t_audio.gif",
"disk" => "t_disk.gif",
"document" => "t_web.gif",
"email" => "t_email.gif",
"help" => "t_help.gif",
"ini" => "t_ini.gif",
"music" => "t_music.gif",
"pdf" => "t_pdf.gif",
"text" => "t_text.gif",
"folder" => "t_folder.gif",
"web" => "t_web.gif",
"word" => "t_word.gif",
"write" => "t_write.gif"
);
var $xmlDepth = array( );
var $treeDepth;
var $lastElement;
var $nodeName;
var $nodeCount;
var $maxLevel;
function startelement( $parser, $name, $attrs )
{
$this->lastElement = $name;
if ( $name == "TREE" )
{
$this->node[0]['treeDepth'] = "0";
$this->node[0]['NAME'] = trim( $attrs['NAME'] );
$this->node[0]['TYPE'] = trim( $attrs['TYPE'] );
$this->node[0]['LINK'] = trim( $attrs['LINK'] );
$this->node[0]['TARGET'] = trim( $attrs['TARGET'] );
$this->node[0]['FORM'] = trim( $attrs['FORM'] );
}
if ( $name == "NODE" )
{
++$this->treeDepth;
if ( $this->maxLevel < $this->treeDepth )
{
$this->maxLevel = $this->treeDepth;
}
++$this->nodeCount;
$this->nodeID = $this->nodeCount;
$this->node[$this->nodeID]['treeDepth'] = $this->treeDepth;
}
while ( list( $k, $v ) = each( $attrs ) )
{
$this->node[$this->nodeID][$k] = trim( $v );
}
++$this->xmlDepth[$parser];
}
function dataelement( $parser, $data )
{
$this->node[$this->nodeID][$this->lastElement] .= trim( $data );
}
function endelement( $parser, $name )
{
if ( $name == "NODE" )
{
--$this->treeDepth;
$this->node[$this->nodeID]['last'] = 1;
}
--$this->xmlDepth[$parser];
}
function maketree( $XML_FILE = "" )
{
if ( get_magic_quotes_runtime( ) )
{
set_magic_quotes_runtime( 0 );
$mq = 1;
}
$this->parser = xml_parser_create( );
xml_set_object( $this->parser, &$this );
xml_set_element_handler( $this->parser, "startElement", "endElement" );
xml_set_character_data_handler( $this->parser, "dataElement" );
if ( $XML_FILE )
{
if ( !( $fp = fopen( $XML_FILE, "r" ) ) )
{
exit( "Could not open XML file" );
}
}
else if ( !( $fp = fopen( $this->file, "r" ) ) )
{
exit( "Could not open XML file" );
}
while ( $data = fread( $fp, 4096 ) )
{
if ( !xml_parse( $this->parser, $data, feof( $fp ) ) )
{
exit( sprintf( "XML error: %s at line %d", xml_error_string( xml_get_error_code( $this->parser ) ), xml_get_current_line_number( $this->parser ) ) );
}
}
xml_parser_free( $this->parser );
if ( $mq )
{
set_magic_quotes_runtime( 1 );
}
return $this->displaytree( );
}
function maketreetext( $XML_TEXT = "" )
{
if ( get_magic_quotes_runtime( ) )
{
set_magic_quotes_runtime( 0 );
$mq = 1;
}
$this->parser = xml_parser_create( );
xml_set_object( $this->parser, &$this );
xml_set_element_handler( $this->parser, "startElement", "endElement" );
xml_set_character_data_handler( $this->parser, "dataElement" );
if ( $XML_TEXT == "" )
{
exit( "XML TEXT is empty!" );
}
$POS = 0;
$LEN = strlen( $XML_TEXT );
while ( $data = substr( $XML_TEXT, $POS, 4096 ) )
{
if ( !xml_parse( $this->parser, $data, 0 ) )
{
exit( sprintf( "XML error: %s at line %d", xml_error_string( xml_get_error_code( $this->parser ) ), xml_get_current_line_number( $this->parser ) ) );
}
$POS += 4096;
if ( $LEN <= $POS )
{
break;
}
}
xml_parser_free( $this->parser );
if ( $mq )
{
set_magic_quotes_runtime( 1 );
}
return $this->displaytree( );
}
function displaytree( )
{
global $e;
$expands = explode( ",", $e );
$totalExpands = count( $expands );
foreach ( $expands as $x )
{
$expand[$x] = 1;
}
$visible[0] = 1;
$aNode = 0;
for ( ; $aNode <= $this->nodeCount; ++$aNode )
{
if ( $this->expandAll == 1 && !$e )
{
$visible[$aNode] = 1;
$expand[$aNode] = 1;
}
if ( $this->node[$aNode]['treeDepth'] == 0 )
{
$visible[$aNode] = 1;
}
if ( $this->node[$aNode]['treeDepth'] < $this->node[$aNode + 1]['treeDepth'] )
{
$expandable[$aNode] = 1;
}
else if ( !( $this->expandAll == 1 && !$e ) && !( $expandable[$aNode] == 1 ) )
{
$expand[$aNode] = 1;
}
}
$i = 0;
for ( ; $i <= $totalExpands; ++$i )
{
$aNode = $expands[$i];
if ( $aNode < $this->nodeCount && $visible[$aNode] == 1 && $expand[$aNode] == 1 )
{
$nextNode = $aNode + 1;
while ( $this->node[$aNode]['treeDepth'] < $this->node[$nextNode]['treeDepth'] )
{
if ( $this->node[$nextNode]['treeDepth'] == $this->node[$aNode]['treeDepth'] + 1 )
{
$visible[$nextNode] = 1;
$lastnode = $nextNode;
}
++$nextNode;
}
$lastNode[$lastnode] = 1;
}
}
$lastlevel = $this->maxLevel;
$i = $this->nodeCount - 1;
for ( ; 0 <= $i; --$i )
{
if ( $this->node[$i]['treeDepth'] < $lastlevel )
{
$nextNode = $this->node[$i]['treeDepth'] + 1;
for ( ; $nextNode < $this->maxLevel; ++$nextNode )
{
$treeLevels[$nextNode] = 0;
}
}
if ( $treeLevels[$this->node[$i]['treeDepth']] == 0 )
{
$treeLevels[$this->node[$i]['treeDepth']] = 1;
$lastNode[$i] = 1;
}
$lastlevel = $this->node[$i]['treeDepth'];
}
$treeHTML = "";
$treeHTML .= ( "<table cellspacing=0 cellpadding=0 border=0 cols=".( $this->maxLevel + 3 ) )." width=".( $this->maxLevel * 16 + $width2 ).">\n";
$treeHTML .= "<tr>";
$i = 0;
for ( ; $i < $this->maxLevel; ++$i )
{
$treeHTML .= "<td width=16></td>";
}
$treeHTML .= "<td></td></tr>\n";
$i = 0;
for ( ; $i < $this->maxLevel; ++$i )
{
$treeLevels[$i] = 1;
}
$aNode = 0;
for ( ; $aNode < $this->nodeCount + 1; ++$aNode )
{
$nextNode = $aNode + 1;
if ( $visible[$aNode] == 1 )
{
$treeHTML .= "<tr>\n";
$i = 0;
for ( ; $i < $this->node[$aNode]['treeDepth'] - 1; ++$i )
{
if ( $treeLevels[$i] == 1 )
{
$treeHTML .= "<td><img src=\"".$this->imgPath.$this->imgType['mbar']."\" alt=\"\"></td>";
}
else
{
$treeHTML .= "<td><img src=\"".$this->imgPath.$this->imgType['mspace']."\" alt=\" \"></td>";
}
}
if ( $this->node[$aNode]['treeDepth'] )
{
if ( $lastNode[$aNode] )
{
$treeDepth1 = $this->node[$aNode]['treeDepth'];
if ( $aNode == $this->nodeCount - 1 && $treeDepth1 == $this->node[$this->nodeCount]['treeDepth'] )
{
$Img = $this->imgType['mtee'];
}
else
{
$Img = $this->imgType['mcorner'];
}
$treeHTML .= "<td><img src=\"".$this->imgPath.$Img."\" alt=\"\"></td>";
$treeLevels[$this->node[$aNode]['treeDepth'] - 1] = 0;
}
else
{
if ( $this->expandAll == 1 )
{
if ( $this->nodeCount == $aNode )
{
$Img2 = $this->imgType['mcorner'];
}
else
{
$Img2 = $this->imgType['mtee'];
}
}
else
{
$Img2 = $this->imgType['mtee'];
}
$treeHTML .= "<td><img src=\"".$this->imgPath.$Img2."\" alt=\"\"></td>";
$treeLevels[$this->node[$aNode]['treeDepth'] - 1] = 1;
}
}
if ( $this->node[$aNode]['treeDepth'] < $this->node[$nextNode]['treeDepth'] )
{
$postString = "?e=";
$i = 0;
for ( ; $i < $this->nodeCount; ++$i )
{
if ( $expand[$i] == 1 xor $aNode == $i )
{
if ( $postString != "?e=" )
{
$postString .= ",";
}
$postString .= $i;
}
}
$postString .= "&FILE_SORT=".$this->FILE_SORT;
if ( $expand[$aNode] == 0 )
{
if ( $lastNode[$aNode] )
{
$treeHTML .= "<td><a href=\"".$PHP_SELF.$postString."\"><img src=\"".$this->imgPath.$this->imgType['cplus']."\" border=\"0\" alt=\"展开\"></a></td>\n";
}
else
{
$treeHTML .= "<td><a href=\"".$PHP_SELF.$postString."\"><img src=\"".$this->imgPath.$this->imgType['tplus']."\" border=\"0\" alt=\"展开\"></a></td>\n";
}
}
else
{
$treeHTML .= "<td><a href=\"".$PHP_SELF.$postString."\"><img src=\"".$this->imgPath.$this->imgType['tminus']."\" border=\"0\" alt=\"收缩\"></a></td>\n";
}
}
else
{
if ( $this->node[$aNode]['TYPE'] )
{
if ( $this->imgPath.$this->imgType[$this->node[$aNode]['TYPE']] )
{
$leafImg = $this->imgPath.$this->imgType[$this->node[$aNode]['TYPE']];
}
else
{
$leafImg = $this->imgPath.$this->imgType['leaf'];
}
}
if ( $leafImg )
{
$treeHTML .= "<td><img src=\"".$leafImg."\" alt=\"\"></td>\n";
}
else
{
$treeHTML .= "<td></td>";
}
}
if ( $this->node[$aNode]['SUB'] == "0" || $aNode == 0 )
{
$treeHTML .= ( "<td valign=top colspan=".( $this->maxLevel - $this->node[$aNode]['treeDepth'] + 3 ) )." nowrap >";
$treeHTML .= "<img src=\"/images/menu/file_folder.gif\"><font face =\"tahoma\" size=\"".$this->fontSize."\"> ";
$treeHTML .= $this->node[$aNode]['NAME']."<br></font>";
$treeHTML .= "</td>\n";
}
else
{
$treeHTML .= ( "<td colspan=".( $this->maxLevel - $this->node[$aNode]['treeDepth'] + 3 ) )." nowrap>";
$treeHTML .= "<font size=\"".$this->fontSize."\">";
if ( $this->node[$aNode]['treeDepth'] < $this->node[$nextNode]['treeDepth'] )
{
if ( $expand[$aNode] == 0 )
{
$treeHTML .= "<img src=\"/images/menu/tree_dir.gif\">";
}
else
{
$treeHTML .= "<img src=\"/images/menu/tree_diropen.gif\">";
}
}
$treeHTML .= "<a href=\"".$this->node[$aNode]['LINK'];
if ( $aNode == 0 )
{
$treeHTML .= "?e=0";
}
else
{
if ( $this->node[$aNode]['LINK'] == "" )
{
$treeHTML .= "?e=".$e;
}
$treeHTML .= "&FILE_SORT=".$this->FILE_SORT;
}
$treeHTML .= "\" ";
if ( $this->node[$aNode]['TARGET'] )
{
$treeHTML .= "target=\"".$this->node[$aNode]['TARGET']."\"";
}
$treeHTML .= ">".$this->node[$aNode]['NAME']."</font></a></td>\n";
}
$treeHTML .= "</tr>\n";
}
}
$treeHTML .= "</table></font>\n";
return $treeHTML;
}
}
echo " \r\n";
?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -