waldi18
Goto Top

Perl Script unter Linux: 2 Dateien, bestimmten Inhalt zusammenspielen

Bitte um dringende Hilfe.
Ich habe 2 Dateien (in meinem Fall XML), einer der beiden (1.Datei) muss mit Teil-Inhalt einer 2. erweitert werden.
Allerdings eben nicht komplett, sondern mit dem Zeilenanfang des ersten Auftretens von <object....
dann komplett von da an alles bis Zeilenende vor </objects> (beachten: Unterschied object und objects!).
Die 1. Datei ist auch so aufgebaut. Der ausgelesene Teil-Inhalt der 2. Datei soll dann in die 1. Datei geschrieben werden, und zwar:
zwischen:
</object>
</objects>
Am besten 3 Leerzeieln zwischen diesen beiden Tag's und in die Mitte dann den Text der 2. Datei schreiben (dann kann man später einfach danach suchen):
</object>

. <object....

Diese Script sollte mit Parameter aufrufbar sein: die erste Datei ist diejenige welche erweitert werden soll,
aus der 2. Datei soll dann gelesen werden, in etwa so: ./merge.pl erweitern.xml auslesen.xml
Nach dem Script soll die 1. Datei eben um den Teilinhalt der 2. gewachsen sein und die 2. Datei bleibt wie sie war.

Hier kurz wie die Dateien aussehen:
<XML......
.
.
.
<objects>
.
<xxxxxx>
.
. <object....
.
.
.
.

</object>
</objects>
</xxxxxx>


Wäre so etwas möglich?
Vielen, lieben Dank an euch!!!!

Content-ID: 272021

Url: https://administrator.de/contentid/272021

Ausgedruckt am: 24.11.2024 um 05:11 Uhr

colinardo
Lösung colinardo 14.05.2015, aktualisiert am 15.05.2015 um 11:47:31 Uhr
Goto Top
Hallo waldi18,
das könnte etwa so aussehen:
#!/usr/bin/perl
use XML::LibXML;
use XML::Twig;
# Dateien öffnen
open my $file1, '<', $ARGV;  
open my $file2, '<', $ARGV[1];  
binmode $file1;binmode $file2;

# Dateien in XML-Objekte einlesen
my $doc1 = XML::LibXML->load_xml(IO => $file1);
my $doc2 = XML::LibXML->load_xml(IO => $file2);
close($file1);close($file2);
# 'object' Elemente holen 
my @objectnodes = $doc2->getElementsByTagName('object');  
# Insert-Node im ersten Dokument holen
my $insertnode = ($doc1->getElementsByTagName('objects'));  
# object nodes in das erste Dokument yxin den 'objects' tag anfügen 
foreach(@objectnodes){$insertnode->appendChild($_);}
# schön formatieren
my $twig = XML::Twig->new(pretty_print => 'indented');  
$twig->set_indent(' ' x 4);  
# File speichern
$twig->parse($doc1->toString())->print_to_file($ARGV)
Ausgeführt wird das dann so wie du das vor hattest:
./merge.pl erweitern.xml auslesen.xml
Grüße Uwe
waldi18
waldi18 14.05.2015 um 19:49:46 Uhr
Goto Top
Hallo Uwe,
vielen Dank für deine Lösung!
Ich werde sie morgen testen, da ich heute nicht mehr an die Daten komme!
Ich informiere wieder!

Schönen Gruß, Namensvetter
Uwe
114757
114757 14.05.2015 aktualisiert um 20:05:54 Uhr
Goto Top
Moin @colinardo,
Danke dir auch für das Script !! Das kann ich bei einem meiner Projekte auch gut gebrauchen, habs gerade mal getestet und läuft wie Schmidts Katze ...
"Da schick ich dir doch glatt noch das halb volle Fäßchen Bier vom Vatertagsausklang" face-smile !

Gruß jodel32
waldi18
waldi18 15.05.2015 um 07:22:57 Uhr
Goto Top
Hi,
bekomme leider folgende Meldung:
Can't locate auto/XML/LibXML/load_xml.al in @inc (@INC contains: /usr/lib64/perl
5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/
lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.
8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at ./merge.pl line 10

Was kann das sein?
Danke für jeden Hinweis,
waldi18
114757
Lösung 114757 15.05.2015 aktualisiert um 11:47:21 Uhr
Goto Top
Was kann das sein?
Perl updaten!, 5.8 ist ja schon vollkommen veraltet (mit diversen Sicherheitslücken), das kennt die XML Bibliothek noch nicht...
http://deps.cpantesters.org/?module=XML%3A%3ALibXML&perl=5.8.8& ...

Gruß jodel32
colinardo
colinardo 15.05.2015 aktualisiert um 10:46:51 Uhr
Goto Top
Zitat von @114757:

> Was kann das sein?
Perl updaten!, 5.8 ist ja schon vollkommen veraltet (mit diversen Sicherheitslücken), das kennt die XML Bibliothek noch
nicht...
Korrekt, so ist es ...
waldi18
waldi18 15.05.2015 um 11:46:32 Uhr
Goto Top
Hi zusammen, perfekt, kaum macht man er richtig schon funktioniert es!

PERFEKT

Vielen Dank! Hat super geholfen!

Schönen Gruß
waldi18