Problem beim parsen von XML-Daten

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

  • Problem beim parsen von XML-Daten

    Hi Leute,

    in einer XML-Datei stehen HTML-Elemente. Genauer gesagt ein select-tag mit mehreren und vor allem einer variierenden anzahl an option-tags.

    das ganze wird in etwa so geliefert und muss so verarbeitet werden:

    Code:
    <result ok="true">		
    	<SET>route</SET>
    	<CID>****</CID>
    	<todo>showRouteList</todo>
    	<state>routeInput</state>
    	<DEVICECHECK>0</DEVICECHECK>		
    	<ALTERNATIVES>50</ALTERNATIVES>		
    	<STYLE>xml</STYLE>		
    	<LANG>DEU</LANG>															
    	
    	<query_result_0 results="6">					
    		<select name="JOINED_0">
    			<option selected value="0|D|25746|Heide|||||1010772|7199214|">D-25746 Heide    </option>
    			<option value="0|D|25746|Heide|Süderholm||||1017271|7199845|">D-25746 Heide Süderholm   </option>
    			<option value="0|D|25746|Heide|Bennewohld||||1022394|7200770|">D-25746 Heide Bennewohld   </option>
    			<option value="0|D|25746|Heide|Dellweg; Gem Heide||||1006371|7200820|">D-25746 Heide Dellweg; Gem Heide   </option>
    			<option value="0|D|25746|Heide|Duvenheide||||1018330|7197726|">D-25746 Heide Duvenheide   </option>
    			<option value="0|D|25746|Heide|Hochfeld||||1008117|7200153|">D-25746 Heide Hochfeld   </option>
    		</select>				
    	</query_result_0>
    </result>

    Ich möchte nun also gerne das Element query_result_0 auslesen.

    Das habe ich erfolglos mit folgendem Script probiert:

    PHP-Code:
    <?
    function elem_start($xml_parser, $name, $attribute) {
        if($name == "query_result_0"){
            xml_set_character_data_handler($xml_parser, "cdata_ausgeben");
        }else{
            xml_set_character_data_handler($xml_parser, "cdata_nichtausgeben");
        }
    }
    function elem_ende($xml, $name) {


    function cdata_ausgeben($xml, $daten){ 
        echo htmlspecialchars($daten);


    function cdata_nichtausgeben($xml, $daten){
    }

    $xml_parser = xml_parser_create();
    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
    xml_set_element_handler($xml_parser, "elem_start", "elem_ende");
    $daten = file_get_contents($file);
    xml_parse($xml_parser, $daten, true);
    xml_parser_free($xml_parser);
    ?>
    Wenn ich statt "query_result_0" oben in der if-schleife beispielsweise "todo" eingebe, dann erhalte ich das richtige ergebnis.
    Was mache ich falsch. Bin für jeden Tip dankbar.

    Danke,

    Flo
    ----------------------------
    Inmitten von Schwierigkeiten stecken Möglichkeiten.
    (Albert Einstein)

  • #2
    Was hast du denn erwartet? Was soll ausgegeben werden?
    Wenn cdata_ausgeben zum CDATA Handler wird, wird anschließend die Funktion verlassen und der XML Parser ruft anschließend erneut elem_start auf. Da aber $name == "select" ist, wird der CDATA Handler wieder zurückgesetzt.

    Entweder gibst du ganz kompliziert die einzelnen Elemente aus, oder du kannst auch einfach alles escapen bzw. eine CDATA Sektion einfügen:

    <![CDATA[Hier muss man nicht escapen!]]>
    Code:
    <result ok="true">		
    	<SET>route</SET>
    	<CID>****</CID>
    	<todo>showRouteList</todo>
    	<state>routeInput</state>
    	<DEVICECHECK>0</DEVICECHECK>		
    	<ALTERNATIVES>50</ALTERNATIVES>		
    	<STYLE>xml</STYLE>		
    	<LANG>DEU</LANG>															
    	
    	<query_result_0 results="6">					
    		<![CDATA[<select name="JOINED_0">
    			<option selected value="0|D|25746|Heide|||||1010772|7199214|">D-25746 Heide    </option>
    			<option value="0|D|25746|Heide|Süderholm||||1017271|7199845|">D-25746 Heide Süderholm   </option>
    			<option value="0|D|25746|Heide|Bennewohld||||1022394|7200770|">D-25746 Heide Bennewohld   </option>
    			<option value="0|D|25746|Heide|Dellweg; Gem Heide||||1006371|7200820|">D-25746 Heide Dellweg; Gem Heide   </option>
    			<option value="0|D|25746|Heide|Duvenheide||||1018330|7197726|">D-25746 Heide Duvenheide   </option>
    			<option value="0|D|25746|Heide|Hochfeld||||1008117|7200153|">D-25746 Heide Hochfeld   </option>
    		</select>]]>				
    	</query_result_0>
    </result>
    Mit freundlich Grüßen,
    yaXay

    Kommentar


    • #3
      danke für die antwort.
      das problem an der geschichte ist aber, dass ich die xml-daten so nehmen muss, wie sie da oben stehen.
      da hab ich keinen einfluss drauf.
      wie kann ich also mit bestehenden daten mein kleines, schnuckeliges select-feldchen ausgeben?
      ----------------------------
      Inmitten von Schwierigkeiten stecken Möglichkeiten.
      (Albert Einstein)

      Kommentar


      • #4
        Das wäre eine übersichtliche Variante:

        PHP-Code:
        <?

        class XMLSelectParser
        {
            var $output = false;
            
            function elementStart($xmlParser, $name, $attributes) {
                if($this->output)
                {
                  echo '<', $name;
                  foreach($attributes as $k => $v)
                  {
                    echo ' ', $k, '="', $v, '"';
                  }
                  echo '>';
                }
                else 
                {
                  if($name == "query_result_0")
                  {
                      $this->output = true;
                  }
                }
            }
            
            function elementEnd($xmlParser, $name)
            {
                if($this->output)
                {
                  if($name == "query_result_0"){
                      $this->output = false;
                  }
                  else
                  {
                    echo '</', $name, '>';
                  }
                }
            }
            
            function characterData($xmlParser, $data)
            {
                if($this->output)
                {
                    echo htmlspecialchars($data);
                }
            }
        }

        $selectParser = new XMLSelectParser();

        $xmlParser = xml_parser_create();
        xml_parser_set_option($xmlParser, XML_OPTION_CASE_FOLDING, false);
        xml_set_element_handler($xmlParser, array(&$selectParser, "elementStart"), array(&$selectParser, "elementEnd"));
        xml_set_character_data_handler($xmlParser, array(&$selectParser, "characterData"));
        $data = file_get_contents($file);
        xml_parse($xmlParser, $data, true);
        xml_parser_free($xmlParser);
        ?>
        An Deiner Stelle würde ich mich aber nicht zu früh freuen, denn Deine Daten sind leider nicht XML-konform. Also musst Du sie zwangsweise ändern, ansonsten kann man sie nicht parsen lassen.

        Ungültig sind:
        Code:
        <option selected>Text</option>
        ä
        ö
        ü
        Gültig sind:
        Code:
        <option selected="selected">Text</option>
        ae
        oe
        uea
        Oder auch:
        Code:
        &amp;auml;
        &amp;ouml;
        &amp;uuml;
        Dann muss &amp;amp; jedoch durch &amp;amp;amp; ersetzt und das htmlspecialchars entfernt werden.

        Mit freundlich Grüßen,
        yaXay

        Kommentar

        Lädt...
        X