文字

XML 元素结构例程

第一个例程缩进显示文档中的开始元素结构。

Example #1 显示 XML 元素结构

<?php
$file 
"data.xml" ;
$depth  = array();

function 
startElement ( $parser $name $attrs
{
    global 
$depth ;
    for (
$i  0 $i  $depth [ $parser ];  $i ++) {
        echo 
"  " ;
    }
    echo 
" $name \n" ;
    
$depth [ $parser ]++;
}

function 
endElement ( $parser $name
{
    global 
$depth ;
    
$depth [ $parser ]--;
}

$xml_parser  xml_parser_create ();
xml_set_element_handler ( $xml_parser "startElement" "endElement" );
if (!(
$fp  fopen ( $file "r" ))) {
    die(
"could not open XML input" );
}

while (
$data  fread ( $fp 4096 )) {
    if (!
xml_parse ( $xml_parser $data feof ( $fp ))) {
        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 );
?>

用户评论:

[#1] Sample at hotmail dot com [2013-07-04 10:32:14]

<?php

public static function xml2array($element$arr = array())
    {
        if(
is_string($element))
        {
            
$element = (strlen($element) > && substr($element, -4) === '.xml'
                            ? 
simplexml_load_file(DATAPATH.$element)
                            : 
simplexml_load_string($element);
        }
         
$iter 0;
        foreach(
$element->children() as $b)
        {
            
$a $b->getName();
            if(!
$b->children()){
                    
$arr[$a] = trim($b[0]);
            }
            else{
                    
$arr[$a][$iter] = array();
                    
$arr[$a][$iter] = self::xml2array($b,$arr[$a][$iter]);
            }
                
$iter++;
        }
        return 
$arr;
    }
}

?>

[#2] roan at horning dot us [2009-10-30 21:07:03]

The following example will echo back an xml file using the basic event based parser.  Currently, (at least in the version of PHP5 I'm using) it will skip The XML declaration and the Doctype declaration--they don't seem to be captured by the default handler.

<?php
echo "<pre>";

$file "test.xml";
echo 
$file."\n";
global 
$inTag;

$inTag "";
$xml_parser xml_parser_create();
xml_parser_set_option($xml_parserXML_OPTION_CASE_FOLDING0);
xml_parser_set_option($xml_parserXML_OPTION_SKIP_WHITE1);
xml_set_processing_instruction_handler($xml_parser"pi_handler");
xml_set_default_handler($xml_parser"parseDEFAULT");
xml_set_element_handler($xml_parser"startElement""endElement");
xml_set_character_data_handler($xml_parser"contents");

if (!(
$fp fopen($file"r"))) {
    if (!
xml_parse($xml_parser$datafeof($fp))) {
       die( 
sprintf("XML error: %s at line %d"
                            
xml_error_string(xml_get_error_code($xml_parser)),
                            
xml_get_current_line_number($xml_parser)));
    }
}
while (
$data fread($fp4096)) {
    if (!
xml_parse($xml_parser$datafeof($fp))) {
       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);

function 
startElement($parser$name$attrs) {

    global 
$inTag;
    global 
$depth;
        
    
$padTag str_repeat(str_pad(" "3), $depth);

    if (!(
$inTag == "")) {
        echo 
"&gt;";
    }
    echo 
"\n$padTag&lt;$name";
    foreach (
$attrs as $key => $value) {
        echo 
"\n$padTag".str_pad(" "3);
        echo 
$key=\"$value\"";
    }
    
$inTag $name;
    
$depth++;
}

function 
endElement($parser$name) {

    global 
$depth;
   global 
$inTag;
    global 
$closeTag;
        
    
$depth--;

   if (
$closeTag == TRUE) {
       echo 
"&lt/$name&gt;";
       
$inTag "";
   } elseif (
$inTag == $name) {
       echo 
" /&gt;";
       
$inTag "";
   } else {
         
$padTag str_repeat(str_pad(" "3), $depth);
       echo 
"\n$padTag&lt/$name&gt;";
    }  
}
  
function 
contents($parser$data) {

    global 
$closeTag;
    
    
$data preg_replace("/^\s+/"""$data);
    
$data preg_replace("/\s+$/"""$data);

    if (!(
$data == ""))  {
        echo 
"&gt;$data";
        
$closeTag TRUE;
    } else {
        
$closeTag FALSE;
     }
}

function 
parseDEFAULT($parser$data) {
    
    
$data preg_replace("/</""&lt;"$data);
    
$data preg_replace("/>/""&gt;"$data);
    echo 
$data;
}

function 
pi_handler($parser$target$data) {

    echo 
"&lt;?$target $data?&gt;\n";
}
echo 
"</pre>";
?>

上一篇: 下一篇: