eno24: Probleme beim auslesen der XML-Datei

Hallo Leute benötige mal euer Fachwissen.

Ich bin neu hier und hoffe ihr könnt mir weiter helfe da ich es in anderen Foren ohne Erfolg probiert habe.
Ohne Erfolg heißt keine Antwort bekommen. Es gibt wahrscheinlich nicht so viele die sich mit XML auskennen.

Ich habe eine XML-Datei die ich auslesen möchte

  • <menu>
      <menu name="Homes" folder="home" introtext="Text zu bild 1" />
      <menu name="Innengestaltung" folder="innengestaltung" introtext=" Text zu bild 2" />
      <menu name="Fassadengestaltung" folder="fassadengestaltung" introtext=" Text zu bild 3" />
      </menu>

Die Daten name und folder bekomme ich wunderbar nur die vom introtext nicht. Habe nun schon zwei Tage darum brobiert und versucht über google nähere informationen zu bekommen es will aber einfach nicht funktionieren.

Hier habe ich mal den Code bereit gestellt.

<?php
class xmlParser{

var $xml_obj = null;
   var $output = array();

function xmlParser(){

$this->xml_obj = xml_parser_create();
       xml_set_object($this->xml_obj,$this);
       xml_set_character_data_handler($this->xml_obj, 'dataHandler');
       xml_set_element_handler($this->xml_obj, "startHandler", "endHandler");

}

function parse($path){

if (!($fp = fopen($path, "r"))) {
           die("Cannot open XML data file: $path");
           return false;
       }

while ($data = fread($fp, 4096)) {
           if (!xml_parse($this->xml_obj, $data, feof($fp))) {
               die(sprintf("XML error: %s at line %d",
               xml_error_string(xml_get_error_code($this->xml_obj)),
               xml_get_current_line_number($this->xml_obj)));
               xml_parser_free($this->xml_obj);
           }
       }

return true;
   }

function startHandler($parser, $name, $attribs){
       $_content = array('name' => $name);
       if(!empty($attribs))
         $_content['attrs'] = $attribs;
       array_push($this->output, $_content);
   }

function dataHandler($parser, $data){
       if(!empty($data)) {
           $_output_idx = count($this->output) - 1;
           $this->output[$_output_idx]['content'] = $data;
       }
   }

function endHandler($parser, $name){
       if(count($this->output) > 1) {
           $_data = array_pop($this->output);
           $_output_idx = count($this->output) - 1;
           $this->output[$_output_idx]['child'][] = $_data;
       }
   }
}

$list = "gallery";

$p =& new xmlParser();
$p->parse('menu.xml');
$galleries = isset($p->output[0]['child']) ? $p->output[0]['child'] : array();

?>
  <h1>Gallerie</h1>
    <hr />
  <form name="form_new" action="gallerie.php" method="post">
   <input type="hidden" name="new_name" value="">
   <a href="javascript:new_gallery()">Neue Gallery anlegen</a>
  </form>
  <form name="form_save" action="sichern.php" method="post" onsubmit="return save_gal('gallery_list');">
   <input type="hidden" name="gal_names" value="">
   <input type="hidden" name="gal_folders" value="">
   <input type="hidden" name="gal_deletes" value="">
   <input type="hidden" name="gal_introtexts" value="">
   <ul id="gallery_list" class="sortable boxy">
    <?php print_galleries($galleries); ?>
   </ul>
   <p><input type="submit" value="&Auml;nderungen sicher"/></p>
  </form>
  <script language="JavaScript"><!--
   <?php print_folders($galleries); ?>
  //-->
  </script>
<?php

// Hauptausgabe
function print_galleries($gals){
 $gals_html = "";
 $count = 0;
 $template = '<li id="gal_%NUM%">
    <div class="handle"></div>
    <div class="text" id="gal_info">
     <input name="name_%NUM%" type="text" value="%NAME%" class="input_gal" />
     <span class="delete"><input type="checkbox" name="delete_%NUM%">l&ouml;schen</span>
     <span class="pic_edit"><input type="button" value="Bilder bearbeiten" onclick="location.href='bild.php?name=%NAME%&folder=%FOLDER%';"/></span>
     <input type="button" value="Bilder einf&uuml;gen" onclick="showUpload('%NAME%','%FOLDER%'); return false;"/>
     <p><input name="introtext_%NUM%" type="text" value="%INTROTEXT%" class="input_gal2" /> Introtext</p>
    </div>
   </li>';

$gal_vars = array("%NUM%", "%NAME%", "%FOLDER%", "%INTROTEXT%");

foreach ($gals as $gal){
  $gal_values = array($count+1, $gals[$count]['attrs']['NAME'], $gals[$count]['attrs']['FOLDER'], $gals[$count]['attrs']['INTROTEXT']);
  $gals_html .= str_replace($gal_vars, $gal_values, $template);
  ++$count;
 }
 echo $gals_html;
}

function print_folders($gals){
 $count = 1;
 foreach ($gals as $gal){
  echo("var folder_$count = "" . $gals[$count-1]['attrs']['FOLDER'] . "";\r\n");
    echo("var introtext_$count = "" . $gals[$count-1]['attrs']['INTROTEXT'] . "";\r\n");
  ++$count;
 }
}

?>

Meine Frage wo liegt mein Denk- bzw. Schreibfehler?

Ich hoffe das mir jemand weiter helfen kann und bedanke mich schon mal im voraus für eure Mühe.

  1. Hallo,

    Ich korrigere nur das Thema, weil es nur marginal mit XML zu tun hat.

    Grüße
    Thomas

    Hallo Leute benötige mal euer Fachwissen.

    Ich bin neu hier und hoffe ihr könnt mir weiter helfe da ich es in anderen Foren ohne Erfolg probiert habe.
    Ohne Erfolg heißt keine Antwort bekommen. Es gibt wahrscheinlich nicht so viele die sich mit XML auskennen.

    Ich habe eine XML-Datei die ich auslesen möchte

    • <menu>
        <menu name="Homes" folder="home" introtext="Text zu bild 1" />
        <menu name="Innengestaltung" folder="innengestaltung" introtext=" Text zu bild 2" />
        <menu name="Fassadengestaltung" folder="fassadengestaltung" introtext=" Text zu bild 3" />
        </menu>

    Die Daten name und folder bekomme ich wunderbar nur die vom introtext nicht. Habe nun schon zwei Tage darum brobiert und versucht über google nähere informationen zu bekommen es will aber einfach nicht funktionieren.

    Hier habe ich mal den Code bereit gestellt.

    <?php
    class xmlParser{

    var $xml_obj = null;
       var $output = array();

    function xmlParser(){

    $this->xml_obj = xml_parser_create();
           xml_set_object($this->xml_obj,$this);
           xml_set_character_data_handler($this->xml_obj, 'dataHandler');
           xml_set_element_handler($this->xml_obj, "startHandler", "endHandler");

    }

    function parse($path){

    if (!($fp = fopen($path, "r"))) {
               die("Cannot open XML data file: $path");
               return false;
           }

    while ($data = fread($fp, 4096)) {
               if (!xml_parse($this->xml_obj, $data, feof($fp))) {
                   die(sprintf("XML error: %s at line %d",
                   xml_error_string(xml_get_error_code($this->xml_obj)),
                   xml_get_current_line_number($this->xml_obj)));
                   xml_parser_free($this->xml_obj);
               }
           }

    return true;
       }

    function startHandler($parser, $name, $attribs){
           $_content = array('name' => $name);
           if(!empty($attribs))
             $_content['attrs'] = $attribs;
           array_push($this->output, $_content);
       }

    function dataHandler($parser, $data){
           if(!empty($data)) {
               $_output_idx = count($this->output) - 1;
               $this->output[$_output_idx]['content'] = $data;
           }
       }

    function endHandler($parser, $name){
           if(count($this->output) > 1) {
               $_data = array_pop($this->output);
               $_output_idx = count($this->output) - 1;
               $this->output[$_output_idx]['child'][] = $_data;
           }
       }
    }

    $list = "gallery";

    $p =& new xmlParser();
    $p->parse('menu.xml');
    $galleries = isset($p->output[0]['child']) ? $p->output[0]['child'] : array();

    ?>
      <h1>Gallerie</h1>
        <hr />
      <form name="form_new" action="gallerie.php" method="post">
       <input type="hidden" name="new_name" value="">
       <a href="javascript:new_gallery()">Neue Gallery anlegen</a>
      </form>
      <form name="form_save" action="sichern.php" method="post" onsubmit="return save_gal('gallery_list');">
       <input type="hidden" name="gal_names" value="">
       <input type="hidden" name="gal_folders" value="">
       <input type="hidden" name="gal_deletes" value="">
       <input type="hidden" name="gal_introtexts" value="">
       <ul id="gallery_list" class="sortable boxy">
        <?php print_galleries($galleries); ?>
       </ul>
       <p><input type="submit" value="&Auml;nderungen sicher"/></p>
      </form>
      <script language="JavaScript"><!--
       <?php print_folders($galleries); ?>
      //-->
      </script>
    <?php

    // Hauptausgabe
    function print_galleries($gals){
    $gals_html = "";
    $count = 0;
    $template = '<li id="gal_%NUM%">
        <div class="handle"></div>
        <div class="text" id="gal_info">
         <input name="name_%NUM%" type="text" value="%NAME%" class="input_gal" />
         <span class="delete"><input type="checkbox" name="delete_%NUM%">l&ouml;schen</span>
         <span class="pic_edit"><input type="button" value="Bilder bearbeiten" onclick="location.href='bild.php?name=%NAME%&folder=%FOLDER%';"/></span>
         <input type="button" value="Bilder einf&uuml;gen" onclick="showUpload('%NAME%','%FOLDER%'); return false;"/>
         <p><input name="introtext_%NUM%" type="text" value="%INTROTEXT%" class="input_gal2" /> Introtext</p>
        </div>
       </li>';

    $gal_vars = array("%NUM%", "%NAME%", "%FOLDER%", "%INTROTEXT%");

    foreach ($gals as $gal){
      $gal_values = array($count+1, $gals[$count]['attrs']['NAME'], $gals[$count]['attrs']['FOLDER'], $gals[$count]['attrs']['INTROTEXT']);
      $gals_html .= str_replace($gal_vars, $gal_values, $template);
      ++$count;
    }
    echo $gals_html;
    }

    function print_folders($gals){
    $count = 1;
    foreach ($gals as $gal){
      echo("var folder_$count = "" . $gals[$count-1]['attrs']['FOLDER'] . "";\r\n");
        echo("var introtext_$count = "" . $gals[$count-1]['attrs']['INTROTEXT'] . "";\r\n");
      ++$count;
    }
    }

    ?>

    Meine Frage wo liegt mein Denk- bzw. Schreibfehler?

    Ich hoffe das mir jemand weiter helfen kann und bedanke mich schon mal im voraus für eure Mühe.

  2. Hallo,

    wenn es keinen bestimmten Grund gibt, dass Du mit SAX Funktionen arbeitest, schau Dir mal die SimpleXML API an, damit geht es viel einfacher.

    Grüsse

    Johannes