Schrift
[thread]9955[/thread]

LibXML:Leerzeile nach geschlossenen Tag hinzufügen

Leser: 1


<< >> 4 Einträge, 1 Seite
m1hoelbl
 2007-08-03 15:40
#97418 #97418
User since
2007-08-03
2 Artikel
BenutzerIn
[default_avatar]
Hallo,

mein Problem ist, dass beim Hinzufügen eines Teilbaums in ein vorhandenes XML-File alles in einer Reihe geschrieben wird und ich hätte gerne, dass nach jedem geschlossenen Tag ein new-line geschrieben wird, weiß aber leider nicht wie und wo.

Code:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
...
$parser = XML::LibXML->new;
$dom = $parser->parse_file("cameras.xml") or die;
@Data = $dom->getElementsByTagName("Data");

# Aufbau des Teilbaums
# camera
$camera_elem = $dom->createElement("camera"); # camera-Element wird erstellt
$camera_elem->setAttribute('cname',$cname); # cname wird als Attribut gesetzt

# cam_id
$cam_id_elem = $dom->createElement("cam_id"); # cam_id-Element wird erstellt
$cam_id_tn = $dom->createTextNode($cam_id); # cam_id-textnode mit der Kamera-ID wird erstellt
$cam_id_elem->appendChild($cam_id_tn); # Der Textnode wird dem cam_id-Element hinzugefuegt

# start
$start_elem = $dom->createElement("start");
$start_tn = $dom->createTextNode($start);
$start_elem->appendChild($start_tn);


$camera_elem->appendChild($cam_id_elem); # cam_id-Element wird dem camera-Element hinzugefügt
$camera_elem->appendChild($start_elem); # start-Element wird dem camera-Element hinzugefügt
$Data[0]->appendChild($camera_elem);

$dom_string = $dom->toString();
...


Jetzt schaut es folgendermaßen aus:
Code: (dl )
1
2
3
4
<?xml version="1.0" encoding="ISO-8859-1"?>
<Data>
...
<camera cname="Kamera1"><cam_id>230</cam_id><start>start</start></camera></Data>


Ich hätte aber gerne, dass es nach jedem endenden Tag eine new-Line eingefügt wird, also folgendermaßen:
Code: (dl )
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="ISO-8859-1"?>
<Data>
...
<camera cname="Kamera1">
<cam_id>230</cam_id>
<start>start</start>
</camera>
</Data>


Ist das irgendwie möglich?? Ich weiß nicht, wo ich beim Code ein "\n" einfügen sollte, dass es so funktioniert!
Vielen Dank im Voraus!

LG Markus
murphy
 2007-08-03 16:35
#97431 #97431
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Versuche doch mal, eine Formatierungsangabe bei der Serialisierung mitzugeben, also zum Beispiel
Code: (dl )
$dom->toString(1)
statt
Code: (dl )
$dom->toString()
.

edit: Wenn das nicht hilft oder Deinen ästhetischen Ansprüchen nicht genügt, musst Du wohl Textknoten, die einen Zeilenumbruch und Leerzeichen für die Einrückung enthalten hinter jeden Elementknoten in den Dokumentbaum einfügen, oder selbst eine Ausgaberoutine basteln, die den Dokumentbaum durchläuft und in der Formatierung ausgibt, die Du haben möchtest.

Es ist halt so, dass zwei XML-Dateien mit und ohne zusätzlichen Whitespace nicht im strengen Sinne identisch sind, weshalb die Serialisierungsroutine einer guten XML-Bibliothek nicht standardmäßig irgendwelche Leerzeichen einfügt, und sei es nur zur Einrückung.
When C++ is your hammer, every problem looks like your thumb.
m1hoelbl
 2007-08-06 11:03
#97602 #97602
User since
2007-08-03
2 Artikel
BenutzerIn
[default_avatar]
Hallo, danke für deine Hilfe!
Habe jetzt deinen Vorschlag mit der Formatierungsangabe versucht:

murphy+2007-08-03 14:35:51--
Versuche doch mal, eine Formatierungsangabe bei der Serialisierung mitzugeben, also zum Beispiel
Code: (dl )
$dom->toString(1)
statt
Code: (dl )
$dom->toString()
.


Doch es funktioniert leider nicht. Wird mir halt nichts anderes übrig bleiben meine eigene Formatierung "zusammen zu basteln". Trotzdem vielen Dank, aber falls jemanden doch noch einfallen sollte, wie es funktionieren könnte, bitte posten.

LG Markus
ptk
 2007-08-06 23:06
#97679 #97679
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du könntest auch
Code: (dl )
$dom->toString(2)
versuchen.
<< >> 4 Einträge, 1 Seite



View all threads created 2007-08-03 15:40.