XML Filter

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • XML Filter

    Hallo Leute!

    Ich habe folgendes Problem:

    Ich habe ein php-Script geschrieben um Daten aus einem XML-File zu lesen
    Das funktioniert ja schon ganz gut jedoch:
    Hat dieses XML-File über 1000 Einträge mit 60 verschiedenen Values (oder wie man das nennt) und das dauert extrem lange zum laden!!!
    Nun möchte ich einen Filter einbauen, der mir z.b.: nur die Personen eines bestimmten Landes aus dem XML-File liest!!
    Anmerkung: ich habe PHP-Version 4.3

    Hier der Sourcecode meines PHP-Scripts:
    PHP-Code:
    function xmlize($data$WHITE=1) {

        
    $data trim($data);
        
    $vals $index $array = array();
        
    $parser xml_parser_create();
        
    xml_parser_set_option($parserXML_OPTION_CASE_FOLDING0);
        
    xml_parser_set_option($parserXML_OPTION_SKIP_WHITE$WHITE);
        if ( !
    xml_parse_into_struct($parser$data$vals$index) )
        {
        die(
    sprintf("XML error: %s at line %d",
                        
    xml_error_string(xml_get_error_code($parser)),
                        
    xml_get_current_line_number($parser)));

        }
        
    xml_parser_free($parser);

        
    $i 0

        
    $tagname $vals[$i]['tag'];
        if ( isset (
    $vals[$i]['attributes'] ) )
        {
            
    $array[$tagname]['@'] = $vals[$i]['attributes'];
        } else {
            
    $array[$tagname]['@'] = array();
        }

        
    $array[$tagname]["#"] = xml_depth($vals$i);

        return 
    $array;
    }


    function 
    xml_depth($vals, &$i) { 
        
    $children = array(); 

        if ( isset(
    $vals[$i]['value']) )
        {
            
    array_push($children$vals[$i]['value']);
        }

        while (++
    $i count($vals)) { 

            switch (
    $vals[$i]['type']) { 

               case 
    'open'

                    if ( isset ( 
    $vals[$i]['tag'] ) )
                    {
                        
    $tagname $vals[$i]['tag'];
                    } else {
                        
    $tagname '';
                    }

                    if ( isset ( 
    $children[$tagname] ) )
                    {
                        
    $size sizeof($children[$tagname]);
                    } else {
                        
    $size 0;
                    }

                    if ( isset ( 
    $vals[$i]['attributes'] ) ) {
                        
    $children[$tagname][$size]['@'] = $vals[$i]["attributes"];
                    }

                    
    $children[$tagname][$size]['#'] = xml_depth($vals$i);

                break; 


                case 
    'cdata':
                    
    array_push($children$vals[$i]['value']); 
                break; 

                case 
    'complete'
                    
    $tagname $vals[$i]['tag'];

                    if( isset (
    $children[$tagname]) )
                    {
                        
    $size sizeof($children[$tagname]);
                    } else {
                        
    $size 0;
                    }

                    if( isset ( 
    $vals[$i]['value'] ) )
                    {
                        
    $children[$tagname][$size]["#"] = $vals[$i]['value'];
                    } else {
                        
    $children[$tagname][$size]["#"] = '';
                    }

                    if ( isset (
    $vals[$i]['attributes']) ) {
                        
    $children[$tagname][$size]['@']
                                                 = 
    $vals[$i]['attributes'];
                    }            

                break; 

                case 
    'close':
                    return 
    $children
                break;
            } 

        } 

        return 
    $children;

    }



    function 
    traverse_xmlize($array$arrName "array"$level 0) {

        foreach(
    $array as $key=>$val)
        {
            if ( 
    is_array($val) )
            {
                
    traverse_xmlize($val$arrName "[" $key "]"$level 1);
            } else {
                
    $GLOBALS['traverse_array'][] = '$' $arrName '[' $key '] = "' $val "\"\n";
            }
        }

        return 
    1;

    }
    /////////////////////////////////////////////////////////////////////////////////////////////////
    $filename="test.xml";
    $i=0;
    $data implode(""file($filename));
    $xml xmlize($data); 


        
    $people $xml["NewDataSet"]["#"]["Table"];
            

        echo 
    "<table border='2' cellpadding='0' bordercolor='black'>";

        for(
    $i 0$i sizeof($people); $i++) {
        
    $person $people[$i];

        
    $Amtstitel     $person["#"]["Amtstitel"][0]["#"]."&nbsp;";
        
    $BeschrakadTitel$person["#"]["BeschrakadTitel"][0]["#"]."&nbsp;";
        
    $Vorname    $person["#"]["Vorname"][0]["#"]."&nbsp;";
        
    $AnsprechpartnerName    $person["#"]["Ansprechpartner-Name"][0]["#"]."&nbsp;";
        
    $Name1    $person["#"]["Name1"][0]["#"]."&nbsp;";
        
    $Amtstitel1    $person["#"]["Amtstitel1"][0]["#"]."&nbsp;";
        
    $BeschrakadTitel1    $person["#"]["BeschrakadTitel1"][0]["#"]."&nbsp;";
        
    $Vorname1    $person["#"]["Vorname1"][0]["#"]."&nbsp;";
        
    $AnsprechpartnerName1    $person["#"]["Ansprechpartner-Name1"][0]["#"]."&nbsp;";
        
    $Ort    $person["#"]["Ort"][0]["#"]."&nbsp;";
    // das passiert dann mit allen weiteren Values auch
        
        
    print "<tr>";
        print 
    "<td nowrap>";print "$Amtstitel";
        print 
    "</td>";
        print 
    "<td nowrap>";print "$BeschrakadTitel";
        print 
    "</td>";
        print 
    "<td nowrap>";print "$Vorname";
        print 
    "</td>";
    //Hier werden alle Values in einer Tabelle angezeigt    


        
    }
        print 
    "</table>"
    Danke schon im Voraus

    LG Manuel

  • #2
    Jo, dann viel erfolg.

    Bedenke jedoch, dass natürlich trotzdem die komplette datei geparst werden muss. auch wenn du nicht alle einträge auswertest.

    Kommentar


    • #3
      Habe das Skript nicht komplett gelesen *schäm* aber wenn's nur darum geht möglichst performant einzelne Teile aus einem XML-Dokument zu extrahieren dann sind die PHP DOM - Erweiterung und die Klasse "DOMXPath" deine Freunde.

      Kommentar

      Lädt...
      X