<?
$file 
"/path/to/xbel.xml";

$depth = array();
$current = array();
$hs = -1;
$na 0;
$nb 0;


function 
startElement($parser$name$attrs)
{
    global 
$open_tags$current_tag$depth$tb$hs$na$current;
    
$current_tag $name;
    
$hs++;
    switch(
$name)
    {
        case 
'XBEL':
            break;
        case 
'FOLDER':
            break;
        case 
'BOOKMARK':
            print 
"\n<li>\n";
            
$current $attrs;
            break;
        default:
            break;
    }
    
array_push($depth$name);
}

function 
endElement($parser$name)
{
    global 
$close_tags$tb$current_tag$depth$hs;
    switch(
$name)
    {
        case 
'XBEL':
            break;
        case 
'FOLDER':
            if (
$hs 1)
                print 
"\n</ul></li>";
            break;
        case 
'BOOKMARK':
            print 
"</li>";
            break;
        default:
            break;
    }
    
array_pop($depth);
    
$hs--;
}

function 
characterData($parser$data)
{
    global 
$current_tag$tb$catID$depth$hs$nb$current;
    
$level $hs-1;
    switch(
$current_tag
    {
        case 
'BOOKMARK':
            
$tb['bookmark'] .= $data;
            
$current_tag '';
            break;
        case 
'TITLE':
            
$tpp array_pop($depth);
            if (
end($depth) == 'FOLDER' && $hs 2
                print 
"<li class=\"header\">\n".
                        
"<h$level>$data</h$level>\n<ul>\n";
            else if (
end($depth) == 'BOOKMARK')
                print 
"\t<a href=\"".htmlspecialchars($current['HREF'],HTML_ENTITIES)."\">$data</a>\n";
            break;
        case 
'DESC':
            print 
"\t<div class=\"descr\">$data</div>\n";
            break;
        default:
            break;
           }
}


$xml_parser xml_parser_create($type);
xml_parser_set_option($xml_parserXML_OPTION_CASE_FOLDINGtrue);
xml_parser_set_option($xml_parserXML_OPTION_TARGET_ENCODING'UTF-8');

xml_set_element_handler($xml_parser"startElement""endElement");
xml_set_character_data_handler($xml_parser"characterData");
$fp fopen($file"r") or die("could not open XML input " $file);


print 
"<br /><br />updated: "date("d M Y  h:m:s T",filemtime($file));


print 
"<ul class=\"bookmarks\">";
while (
$data fread($fp4096))
{
    
xml_parse($xml_parser$datafeof($fp)) or 
        die (
sprintf("XML error: %s at line %d",
            
xml_error_string(xml_get_error_code($xml_parser)),
            
xml_get_current_line_number($xml_parser)));

}
xml_parser_free($xml_parser);

print 
"</ul>";
?>