Matthias: SimpleXml Verschachtelte Nodes

Hallo,

ich versuche mich gerade daran, XML mit SimpleXml zu parsen, und hänge nun an einem Punkt. Kann mir hier bitte jemand helfen?

Der kritische XML-String ist:
<para>Vorher <emphasis role="bold">emphasis</emphasis> Nachher</para>

Mein Parser sieht aus wie folgt:

  function RecurseChildren($ParentNode)  
  {  
    global $NodesMissingDefinition,  
           $Global;  
    foreach ( $ParentNode->children() as $Node )  
    {  
      $NodeName       = $Node->getName();    //Name der Current Node  
      $NodeData       = $Node;               //Inhalt der Curret Node  
      $NodeAttributes = $Node->attributes(); //Array mit allen Attributen $NodeAttributes[Attributname] = attributValue  
      $NodeInclude    = "html/node_$NodeName.inc" ;  
      if ( file_exists($NodeInclude) )  
      {  
        include($NodeInclude);  
      } else {  
        RecurseChildren($Node);  
        if ( !in_array($NodeName, $NodesMissingDefinition) )  
        {  
          array_push($NodesMissingDefinition,$NodeName);  
        }  
      }  
    }  
    return;  
  }

Für obiges Beispiel wird als $NodeInclude erst node_para.inc

<?php  
  echo "<p>";  
    echo $NodeData;  
    RecurseChildren($Node);  
  echo "</p>";  
?>

und dann node_emphasis.inc

<?php  
  
  switch ( $NodeAttributes["role"] )  
  {  
    case "bold":  
         $emphasis_class="emphasis_bold"; break;  
    case "underline":  
         $emphasis_class="emphasis_underline"; break;  
    case "italic":  
         $emphasis_class="emphasis_italic"; break;  
    default:  
         $emphasis_class="emphasis_bold"; break;  
  }  
  
  echo "<span class=\"$emphasis_class\">";  
    echo $NodeData;  
    RecurseChildren($Node);  
  echo "</span>";  
?>

eingebunden.

Als Ergebnis hätte ich gerne:
<p>Vorher <span class="bold">emphasis</span> Nachher</p>, erhalte aber: <p>Vorher Nachher <span class="bold">emphasis</span></p>, was mir im Nachhinein auch einleuchtet.

Meine Frage ist nun, kann ich mit SimpleXML diese Verschachtelung richtig auflösen? Habe mir den Kopf zerbrochen aber keine Lösung gefunden, Google-Suchen haben mir auch kein Ergebnis gebracht.

Bisher habe ich immer mit den XML-Parser-Funktionen gearbeitet, wo über ~~~php xml_set_element_handler($XmlParser, "NodeStart", "NodeEnd");
  xml_set_character_data_handler($XmlParser, "NodeData");

  
Vielen Dank.  
  
Gruß  
  
Matthias  
  

  1. echo $begrüßung;

    ich versuche mich gerade daran, XML mit SimpleXml zu parsen, und hänge nun an einem Punkt. Kann mir hier bitte jemand helfen?
    Der kritische XML-String ist:
    <para>Vorher <emphasis role="bold">emphasis</emphasis> Nachher</para>

    Das, so behaupte ich mal, ist für SimpleXML zu kompliziert. Du willst Textnodes und XML-Elemente getrennt behandeln und dafür (genauer für Textnodes) sehe ich keine Funktion. Jedoch geht es mit der DOM-Extension:

    $doc = new DOMDocument();  
    $doc->loadXML('<para>Vorher <emphasis role="bold">emphasis</emphasis> Nachher</para>');  
    $para = $doc->childNodes->item(0);  
    foreach ($para->childNodes as $child)  
      echo "Node: $child->nodeName, Content: $child->textContent\n";
    

    ergibt:

    Node: #text, Content: Vorher
    Node: emphasis, Content: emphasis
    Node: #text, Content:  Nachher

    echo "$verabschiedung $name";

    1. Okay, vielen Dank!