Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrzeiliger Text aus XML via PHP auslesen
AlexKahl
06-03-2005, 17:52
Hallo,
ich bin zugegeben ein Newbie was XML angeht und brauche daher etwas Hilfe. Und zwar möchte ich einen mehrzeiligen Text aus einem XML-Tag mit Sax parsen und in eine Variable laden. Allerdings liest er immer nur den Text aus der ersten Zeile (also direkt nach <beispiel>) ein, nicht aber die folgenden Zeilen bis zum </beispiel>.
Wie kann man die XML-Tags anpassen, dass sie auch mehrzeilige Texte beinhalten können?
Für jede Hilfe dankbar,
AlexKahl
spoensche
22-04-2005, 15:15
Welche php version benutzt du?
Bei php 5 kannst du die DOM funktionen benutzen.
$dom = new DOMDocument();
$dom->load('datei.xml');
$elementBeispiel = $dom->getElementsByTagName("beispiel");
//wenn es mehrere elemente sind
foreach ($elementBeispiel as $beispiel)
echo $beispiel->textContent;
Hallo AlexKahl,
für PHP Version <5 gibt es die DOMIT!-Klasse.
DOMIT! Version 0.99
http://www.engageinteractive.com/domit/
"DOMIT! is an xml parser for PHP based on the Document Object Model (DOM) Level 2 specification. It is lightweight, fast, and written purely in PHP."
Die Klasse verwende ich öfters und bin sehr zufrieden damit :)
Der Code ist der gleiche wie spoensche geschrieben hat.
Gruß
nEox
undefined
23-04-2005, 14:47
Hallo,
Wie kann man die XML-Tags anpassen, dass sie auch mehrzeilige Texte beinhalten können?
AlexKahl
CDATA ist das Zauberwort ;)
AlexKahl
01-05-2005, 23:34
Erstmal danke für's Feedback.
Ich verwende PHP 4.3. Ich will wirklich nichts weiter, als mit PHP auf eine einfache XML-Datei zugreifen zu können. Speziell: Ich erstelle einen Episodenguide, wobei jede Episode eine eigene XML-Datei mit der folgenden Struktur erhält:
<episode>
<title>TITEL</title>
<desc>DESCRIPTION</desc>
<airdate></airdate>
</episode>
Im Prinzip sollen die Inhalte nur eingelesen, aber nicht bearbeitet oder erneut gespeichert werden. SAX sollte also reichen, denke ich. Allerdings bin ich XML-Neuling und finde nicht so recht eine Lösung. Mein Ansatz funktioniert noch nicht so wie ich es mir vorgestellt habe. Hier das Listing:
function xml_read($file) {
global $content;
//$file="test/test.xml"; // erster Ãbergabeparameter $file
$depth=0;
/*
function startElement($parser, $name, $attrs) {
global $depth;
$depth++;
}
function endElement($parser, $name) {
global $depth;
$depth++;
}
function characterData($parser, $data) {
global $content,$depth;
$content[$depth] = $data;
}
*/
$xml_parser = xml_parser_create();
xml_set_character_data_handler($xml_parser, "characterData");
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}
while ($data = fread($fp, 4096)) {
if(!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML-Error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
return $content;
}
Der Code funktioniert zwar einigermaßen, jedoch kann ich keine mehrzeiligen XML-Daten einlesen, quasi:
<desc>
Dies
ist
ein
Test.
</desc>
@undefined:
CDATA ist mir zwar vage ein Begriff, aber wie definieren bzw. handhaben...?
Kann mir jemand einen Denkanstoss geben. Beim googeln bin ich nicht wirklich fündig geworden, zumindest für meinen Zweck.
Für jede Hilfe nachwievor mehr als dankbar!
AlexKahl
AlexKahl
01-05-2005, 23:41
Bin nochmal dem Hinweis von nEox nachgegangen. Ist sehr vielversprechend und hilft mir vielleicht schon. Sorry, hatte ich wohl irgendwie übersehen. :confused:
undefined
02-05-2005, 06:40
@undefined:
CDATA ist mir zwar vage ein Begriff, aber wie definieren bzw. handhaben...?
<episode>
<title>TITEL</title>
<desc>DESCRIPTION</desc>
<airdate><![CDATA[mein
mehrspaltiger
text
und sonstige \n Sonder Zeichen]]></airdate>
</episode>
PS: Ein Blick in die W3C Manual schadet nie ;)
mfg undefined
AlexKahl
02-05-2005, 19:43
Ich muss mich schon wieder bedanken ;-)
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.