SimpleXml Verschachtelte Nodes
Matthias
- php
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
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";
Okay, vielen Dank!