solr xml parsen

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

  • solr xml parsen

    Hallo zusammen,

    ich bekomme über einen Webservice folgendes xml.
    Ich hab zwar einen Parser drüberlaufen lassen und die Daten zu
    verarbeiten, bekomme jedoch eben nicht die Namen der Felder.
    Hat jemand hier damit schon mal gearbeitet und kann helfen.

    ich hab hier mit der einer Klasse namens xmlparser.class.php
    probiert.

    Danke

    Dim

    z.B. (felder habe ich geleert)
    <?xml version="1.0" encoding="UTF-8"?>
    <response>
    <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">0</int>
    <lst name="params">
    <str name="explainOther"/>
    <str name="fl">*,score</str>
    <str name="indent">on</str>
    <str name="start">0</str>
    <str name="q">xxx</str>
    <str name="hl.fl"/>
    <str name="qt">standard</str>
    <str name="fq">xxx</str>
    <str name="rows">10</str>
    <str name="version">2.2</str>
    </lst>
    </lst>
    <result name="response" numFound="" start="0" maxScore="0.8152084">
    <doc>
    <float name="score"></float>
    <str name="abstract"></str>
    <str name="authors"/>
    <str name="body"></str>
    <date name="datechange"></date>
    <str name="editor"></str>
    <bool name="fee"></bool>
    <int name="id"></int>
    <str name="lasteditor"></str>
    <str name="site"></str>
    <bool name="sitehidden"></bool>
    <str name="title"></str>
    </doc>
    <doc>
    <float name="score"></float>
    <str name="abstract"></str>
    <str name="authors"/>
    <str name="body"></str>
    <date name="datechange"></date>
    <str name="editor"></str>
    <bool name="fee"></bool>
    <int name="id"></int>
    <str name="lasteditor"></str>
    <str name="site"></str>
    <bool name="sitehidden"></bool>
    <str name="title"></str>
    </doc>
    </result>
    </response>


    Überden Parser bekomme ich ein Array folgender Art:
    Array
    (
    [response] => Array
    (
    [lst] => Array
    (
    [0] => 0
    [1] => 0
    [lst] => Array
    (
    [0] =>
    [1] => on
    [2] =>
    [3] => 10
    [4] => 2.2
    [5] => *,score
    [6] => 0
    [7] =>
    [8] =>
    [9] =>
    )

    )

    [result] => Array
    (
    [0] => Array
    (
    [float] =>
    [10] =>
    [11] =>
    [12] =>
    [date] =>
    [13] =>
    [bool] =>
    [2] =>
    [14] =>
    [15] =>
    [16] =>
    )

    [1] => Array
    (
    [float] =>
    [17] =>
    [18] =>
    [19] =>
    [date] =>
    [20] =>
    [bool] =>
    [3] =>
    [21] =>
    [22] =>
    [23] =>
    )
    )

    )
    }

  • #2
    Funzt

    Für alle die es interessiert.
    Ich habe ein Paar Änderungen an der Klasse gemacht, sodas ich den Attributnamen als Namen des Arrayfeldes nehemn kann.

    Ich bin hier nicht auf irgendwelche Sonderfälle und was ist wenn das
    xmls so angeboten wird und und und eingegangen.

    Funktionniert nur wenn das xml genauso ausssieht wie im anfangspost.
    Eine einfache if-weiche sollte genügen um alles abzufangen, jedoch habe ich dies jetzt nicht gemacht!

    Die class
    PHP-Code:
    class Xmlparser  {
       
        
    // raw xml
        
    var $rawXML;
        
        
    // xml parser
        
    var $parser null;
        
        
    // array returned by the xml parser
        
    var $valueArray = array();
        var 
    $keyArray = array();
       
        
    // arrays for dealing with duplicate keys
        
    var $duplicateKeys = array();
       
        
    // return data
        
    var $output = array();
        var 
    $status;
        
        
    // Encoding
        
    var $encoding "";

        function 
    Xmlparser($xml){
            
    $this->rawXML $xml;
            
    $this->parser xml_parser_create();
            return 
    $this->parse();
        }

        function 
    parse(){
           
            
    $parser $this->parser;
            
    xml_parser_set_option($parserXML_OPTION_TARGET_ENCODING"utf-8");
            
    xml_parser_set_option($parserXML_OPTION_CASE_FOLDING0); // Dont mess with my cAsE sEtTings
            
    xml_parser_set_option($parserXML_OPTION_SKIP_WHITE1);     // Dont bother with empty info
            
    if(!xml_parse_into_struct($parser$this->rawXML$this->valueArray$this->keyArray)){
                
    $this->status 'error: '.xml_error_string(xml_get_error_code($parser)).' at line '.xml_get_current_line_number($parser);
                return 
    false;
            }
            
    xml_parser_free($parser);

            
    $this->findDuplicateKeys();

            
    // tmp array used for stacking
            
    $stack = array();        
            
    $increment 0;
           
            foreach(
    $this->valueArray as $val) {
                if(
    $val['type'] == "open") {
                    
    //if array key is duplicate then send in increment
                    
    if(array_key_exists($val['tag'], $this->duplicateKeys)){
                        
    array_push($stack$this->duplicateKeys[$val['tag']]);
                        
    $this->duplicateKeys[$val['tag']]++;
                    }
                    else{
                        
    // else send in tag
                        
    array_push($stack$val['tag']);
                    }
                } elseif(
    $val['type'] == "close") {
                    
    array_pop($stack);
                    
    // reset the increment if they tag does not exists in the stack
                    
    if(array_key_exists($val['tag'], $stack)){
                        
    $this->duplicateKeys[$val['tag']] = 0;
                    }
                } elseif(
    $val['type'] == "complete") {
                  
    // Wenn das Tag den attritunnamen im xmlTag hat und nicht eindeutig zu lesen ist! :-)  
                    
    if(is_array($val['attributes']))
                      {
                        
    array_push($stack$val['attributes']['name']);
                        
    $this->duplicateKeys[$val['tag']]++;
                      }
                     else
                      {
                        
    array_push($stack$val['tag']);
                      }
                      
                  
    //if array key is duplicate then send in increment
                  //Wenn jedes Tag einen "normalen" namen hat    
                  //if(array_key_exists($val['tag'], $this->duplicateKeys)){
                  //      array_push($stack, $this->duplicateKeys[$val['tag']]);
                  //      $this->duplicateKeys[$val['tag']]++;
                  //  }
                  //  else{               
                  //      // else send in tag
                  //      array_push($stack,  $val['tag']);
                  //  }
                    
    $this->setArrayValue($this->output$stack$val['value']);
                    
    array_pop($stack);
                }
                
    $increment++;
            }
            
            
    $this->status 'success: xml was parsed';
            return 
    true;

        }
       
        function 
    findDuplicateKeys(){
           
            for(
    $i=0;$i count($this->valueArray); $i++) {
                
    // duplicate keys are when two complete tags are side by side
                
    if($this->valueArray[$i]['type'] == "complete"){
                    if( 
    $i+count($this->valueArray) ){
                        if(
    $this->valueArray[$i+1]['tag'] == $this->valueArray[$i]['tag'] && $this->valueArray[$i+1]['type'] == "complete"){
                            
    $this->duplicateKeys[$this->valueArray[$i]['tag']] = 0;
                        }
                    }
                }
                
    // also when a close tag is before an open tag and the tags are the same
                
    if($this->valueArray[$i]['type'] == "close"){
                    if( 
    $i+count($this->valueArray) ){
                        if(    
    $this->valueArray[$i+1]['type'] == "open" && $this->valueArray[$i+1]['tag'] == $this->valueArray[$i]['tag'])
                            
    $this->duplicateKeys[$this->valueArray[$i]['tag']] = 0;
                    }
                }
               
            }
           
        }
       
        function 
    setArrayValue(&$array$stack$value){
            if (
    $stack) {
                
    $key array_shift($stack);
                
    $this->setArrayValue($array[$key], $stack$value);
                return 
    $array;
            } else {
                
    $array $value;
            }
        }
       
        function 
    getOutput(){
            return 
    $this->output;
        }
       
        function 
    getStatus(){
            return 
    $this->status;   
        }
          

    Kommentar

    Lädt...
    X