XML Parsen, CDATA ignorieren

P

Pony

Guest
Hallo.

Dank dieser tollen Seite habe ich nun einen einfachen Weg gefunden mit PHP XML in Arrays umzuwandeln. Ich bin nicht ganz der Könner, so war das vorher eine Art Buch mit 7 Siegeln.

Es handelt sich hier rum: http://www.ayom.com/faq/wie-parse-ich-xml-mit-php-a-208.html

Das Funktioniert sehr gut. Allerdings wandelt die Function auch <![CDATA[ ... ]]>-Tags um. Nun wollte ich fragen ob und wie man die Function anpassen kann, sodass <![CDATA[]]> ignoriert wird und komplett in den Array kommt? Kann jemand helfen, eventuell auch mit einer entsprechenden Code-Zeile?

Wink
 
Eine andere Möglichkeit wäre DOM:
http://www.php.net/manual/de/ref.dom.php

Das gibt es schon seit PHP4

Ein ersatz für xml2array wäre zB:
CODE
function DOMxml2array($n) {
$return=array();

foreach($n->childNodes as $nc)
($nc->hasChildNodes())
?($n->firstChild->nodeName== $n->lastChild->nodeName&&$n->childNodes->length>1)
?$return[$nc->nodeName][]=xml2array($item)
:$return[$nc->nodeName]=xml2array($nc)
:$return=$nc->nodeValue;

return $return;
}



Aber eigentlich ist man besser dran, wenn man es nicht erst zum Array umwandelt, sondern gleich mit DOM-Funktionen arbeitet.

DOMxml2array kannst du zB. so verwenden:

CODE
$xml= new DOMDocument();
$xml->preserveWhiteSpace=false;
$xml->loadXML($xmlcode);
print_r(DOMxml2array($xml));



Wobei $xmlcode ein String ist, der XML-Daten enthält.
Oder:

CODE
$xml= new DOMDocument();
$xml->preserveWhiteSpace=false;
$xml->load($filename);
print_r(DOMxml2array($xml));



wobei $filename den Dateinamen der XML-Datei einthalten sollte.

Das Problem mit CData hat sich dann auch erledigt. Allerdings ist der Ergebnis immer in UTF-8 und die XML-Entities sind bereits konvertiert.
 
Hallo Maik,

ich wollte das ganze gerade auch mal ausprobieren aber bekomme bei diesem snippet

CODE <?php
function DOMxml2array($n) {
$return=array();

foreach($n->childNodes as $nc)
($nc->hasChildNodes())
?($n->firstChild->nodeName== $n->lastChild->nodeName&&$n->childNodes->length>1)
?$return[$nc->nodeName][]=xml2array($item)
:$return[$nc->nodeName]=xml2array($nc)
:$return=$nc->nodeValue;

return $return;
}

$xml= new DOMDocument();
$xml->preserveWhiteSpace=false;
$xml->load($url);
print_r(DOMxml2array($xml));
?>


Immer folgende Fehlermeldung:
QUOTE Call to undefined function: load()
wo muss ich die Funktion load() denn vorher definieren bzw. wie müsste das aussehen.

1000Fragen
wink.gif


vielen Dank
 
Falls du PHP 5 hast, probier mal das. Wandelt SimpleXML in ein Array um:

QUOTE
function simplexml2array($xml) {
if (get_class($xml) == 'SimpleXMLElement') {
$attributes = $xml->attributes();
foreach($attributes as $k=>$v) {
if ($v) $a[$k] = (string) $v;
}
$x = $xml;
$xml = get_object_vars($xml);
}
if (is_array($xml)) {
if (count($xml) == 0) return (string) $x; // for CDATA
foreach($xml as $key=>$value) {
$r[$key] = simplexml2array($value);
}
if (isset($a)) $r['@'] = $a; // Attributes
return $r;
}
return (string) $xml;
}

 
DOM XML von PHP4 ist etwas anders als DOM von PHP5

Ich kann es nicht testen, aber vielleicht geht es so:
CODE
<?php
function DOMxml2array($n) {
$return=array();

foreach($n->childNodes as $nc)
($nc->hasChildNodes())
?($n->firstChild->nodeName== $n->lastChild->nodeName&&$n->childNodes->length>1)
?$return[$nc->nodeName][]=xml2array($item)
:$return[$nc->nodeName]=xml2array($nc)
:$return=$nc->nodeValue;

return $return;
}

if ($xml = domxml_open_file($url)) {
print_r(DOMxml2array($xml->document_element));
}
?>

 
Zurück
Oben