Hallo zusammen,
Ich habe ein fast schon paradoxes Problem: ich habe einen fremdgenerierten (anderes Programm) String, der zeilenweise in einer XML gespeichert wird. Diesen String will ich dann auslesen und weiterverarbeiten. Dabei ist mir aufgefallen, das Zeilenumbrüche reproduzierbar erst ab einer bestimmten Stelle erkannt werden.
Rahmenbedingungen:
Ich will eine Mediabibliothek für meinen WHS (Windows Home Server) umsetzen. Auf dem WHS läuft die aktuelle Wamp Version. Die Metadaten zum anzeigen wurden mit meta<browser/> erstellt und jeweils in einer mymovies.xml im Verzeichnis=Film gespeichert. Danach habe ich mit Fi!o die Mediendaten (Mediainfo.dll) ausgelesen und ebenfalls jeweils in der dazugehörigen mymovies.xml gespeichert.
Es wäre zuviel den ganzen Code zu posten deswegen mach ich das ganze auszugweise.
Die XML
Code:
<AudioCodec>AC-3 </AudioCodec>
<AudioLanguage>German</AudioLanguage>
<MediaInfo>General
Complete name : Z:\HD-Filme\***.MKV
Format : Matroska
File size : 7.82 GiB
Duration : 2h 31mn
Overall bit rate : 7 369 Kbps
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High@L4.1
Format settings, CABAC : Yes
Format settings, ReFrames : 10 frames
Muxing mode : Container profile=Unknown@4.1
Codec ID : V_MPEG4/ISO/AVC
...usw
</MediaInfo>
versuche ich nun den tag <Mediainfo> auszulesen wird alles bis Video in fortlaufenden String ausgegeben. Da ist dann der erste Zeilenumbruch, den PHP erkennt (somit werden ab ID alle Zeilen korrekt erkannt). Dabei ist es irrelevant ob ich nl2br() oder str_replace("\n", "<br>", ... ) nutze. explode("\n", ... ), welches ich eigentlich brauche um weiter zu machen funktioniert logischer Weise auch nicht. Kombination aus \n und \r geben mir nur einen einzigen String zurück, also das funktioniert schonmal gar nicht. Ebenfalls ist es egal welche mymovies.xml ich versuche.
Ein HexEditor zeigt mir an, das in der XML hinter jeder Zeile im <MediaInfo> ein 0D 0A steht also sind die Zeilenumbrüche vorhanden.
Ich weis nicht mehr weiter. Ich sitz jetz schon seit 2 Tagen an dem Problem und habe keine Lösung gefunden. Vielleicht fällt jemanden noch etwas ein.
BTW. Das XML wird per xmlParser in ein handbareres Array umgewandelt. Dort sind aber keinerlei trim's oder replaces verwendet:
PHP-Code:
private function generateMovieArray($xmlArr) {
if (is_array($xmlArr)) {
// Array auf Startpunkt festsetzt
$xmlArr = $xmlArr[0]["child"];
// Das Array durchlaufen
while ($val = current($xmlArr)) {
// Schon mal das nächste Element holen um zu erkennen ob eine Liste beginnt (gleiche Indizes [name])
$tmp = next($xmlArr);
// Prüfe ob eine Liste vorhanden
if (($tmp["name"] == $val["name"]) || !$tmp["name"]) {
// Liste vorhanden
// Prüfen ob das Element Kindknoten hat
if (array_key_exists("child", $val)) {
// Ja -> rekursiv mit Kindnoten fortfahren
$return[][$val["name"]] = $this->generateMovieArray(array($val));
} else {
// Nein -> Element einfach in die Liste eintragen
$return[][$val["name"]] = $val["content"];
}
} else {
// Keine Liste vorhanden
// Prüfen ob das Element Kindknoten hat
if (array_key_exists("child", $val)) {
// Ja -> rekursiv mit Kindnoten fortfahren
$return[$val["name"]] = $this->generateMovieArray(array($val));
} else {
// Nein -> Element einfach in das Array eintragen
$return[$val["name"]] = $val["content"];
}
}
}
return $return;
} else {
return false;
}
}
Besten Dank
Rigger