Font
[thread]7433[/thread]

XML Out - Hash

Tags: Similar Threads

Reader: 1


<< |< 1 2 >| >> 15 entries, 2 pages
Dubu
 2005-11-04 14:14
#59718 #59718
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
Ich kenne XML::Simple kaum, aber ...

<geraten type="wild">
Schon mal mit print XML $xml statt print XML $struct probiert? ;)
</geraten>
Schmidtl
 2005-11-04 13:49
#59719 #59719
User since
2005-09-27
14 articles
BenutzerIn
[default_avatar]
Hallo,

ich möchte eine XML Datei berabeiten, d.h. Inhalte löschen, hinzufügen und bearbeiten. Nun habe ich an XML::Simple gedacht. Das Tutorial http://perloo.de/XML/Simple/01.html ist prinzipiell super aber leider funktioniert es nicht zu 100%.

Meine Quelle (in.xml):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version='1.0' standalone='yes'?>
<opt>
 <links title="Links" key="foi">
   <page link="http://www.perl.org" title="www.perl.org">
     <active en="The home of Perl" de="Die Homepage von Perl" />
     <passive en=" and the Perl Community, the former home of the
                  Perl Mongers and all."
              de=" und der Perl Gemeinschaft, die alte Homepage
                  der Perl Mongers usw." />
   </page>
 </links>
</opt>


wird verarbeitet durch folgenden Quelltext:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/perl -w

use CGI qw/:standard/;
use strict;
use warnings;
use CGI;

print header;
print start_html(-title=>"Test",-style=>{-src=>"site.css"});

print "<style type='text/css'> input{ text-align:center; color: black; font-weight:600; } </style>\n";
print "<style type='text/css'> .input_left{ text-align:left; color: black; font-weight:600; } </style>\n";


use XML::Simple;               # XML ganz einfach
use Data::Dumper;              # Daten visualisieren
use Slurp;                     # Slurpt ganze Dateien in Variablen

open ( DUMP , "> out.dump" ); # Öffnet Ausgabedatei für Data::Dumper

my $xml = slurp( "in.xml" );  # XML aus der Datei in String einlesen

my $struct = XMLin( $xml,    # Macht eine Datenstruktur daraus
             ( forcearray => [ qw/page/ ] ) );

print DUMP Dumper $struct;   # Druckt in die Ausgabedatei

open ( XML , "> out.xml" );     # Öffnet Ausgabedatei für XML

my $dump = slurp( "out.dump" ); # Inhalt der Dumper-Datei einlesen

$struct = eval( $dump );    # Macht eine Datenstruktur daraus

$struct->{links}->{page}->[0]->{time} = time(); # fügt Zeit hinzu.

$xml = XMLout( $struct,     # Macht XML aus der Datenstruktur
         ( xmldecl => 1 ) ); # Zeile: <?xml version='1.0' standalone='yes'?>

print XML $struct;             # Druckt in die Ausgabedatei

close (DUMP);
close (XML);


Als Ergebnis sollte nun in out.xml die gleiche XML - Struktur mit einer zusätzlichen Zeile stehen. Aber leider steht in out.xml nur ein Hash (HASH(0x86bb864)) drin. Wie bekomme ich aber dort die XML Struktur hinein???

Danke.

MfG
pq
 2005-11-04 14:46
#59720 #59720
User since
2003-08-04
12204 articles
Admin1
[Homepage]
user image
das hat aber nix mit CGI zu tun - verschoben nach Allgemeines
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Schmidtl
 2005-11-04 15:17
#59721 #59721
User since
2005-09-27
14 articles
BenutzerIn
[default_avatar]
Hallo!

@pq: Sorry, die Chance war 50:50.

@Dubu: Da steht dann in meiner XML Datei nur die Zeit. Es fehlt der ganze Rest.

Hat noch jmd. Ideen/Lösungen/Vorschläge?

MfG
pq
 2005-11-04 15:44
#59722 #59722
User since
2003-08-04
12204 articles
Admin1
[Homepage]
user image
[quote=Schmidtl,04.11.2005, 12:49]
Code: (dl )
1
2
3
use strict;
...
$struct = eval( $dump );    # Macht eine Datenstruktur daraus
[/quote]
mach mal:
eval "my $dump";
immer $@ abfragen nach einem eval! dann hättest du gesehen, dass $struct
an der stelle schon leer ist und das ganze nichts mit XML::Simple zu tun hat.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Schmidtl
 2005-11-07 08:48
#59723 #59723
User since
2005-09-27
14 articles
BenutzerIn
[default_avatar]
Hallo,

ich habe jetzt eine Weile daran unprobiert aber auch dein Vorschlag bringt nichts. Am Ende steht mein toller Hash immer noch in out.xml.

Was kann ich noch machen? Woran liegt es? Eigentlich muss ich doch "nur" den Hash in eine Datenstruktur umwandeln, oder?

MfG\n\n

<!--EDIT|Schmidtl|1131347050-->
renee
 2005-11-07 10:02
#59724 #59724
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Das liegt daran, dass die Umwandlung aus der Datei in eine Datenstruktur nicht funktioniert!

Musst Du denn den Weg ueber die Zwischendatei gehen?? (Oder benutz z.B. Storable...)\n\n

<!--EDIT|renee|1131350718-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2005-11-07 10:10
#59725 #59725
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Das hier funktioniert bei mir:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl -w

use strict;
use warnings;
use XML::Simple; # XML ganz einfach

my $struct = XMLin( "test.xml", # Macht eine Datenstruktur daraus
( forcearray => [ qw/page/ ] ) );

open ( XML , "> out.xml" ); # Öffnet Ausgabedatei für XML
$struct->{links}->{page}->[0]->{time} = time(); # fügt Zeit hinzu.
$xml = XMLout( $struct, # Macht XML aus der Datenstruktur
( xmldecl => 1 ) ); # Zeile: <?xml version='1.0' standalone='yes'?>
print XML $xml; # Druckt in die Ausgabedatei
close (XML);
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Schmidtl
 2005-11-07 10:20
#59726 #59726
User since
2005-09-27
14 articles
BenutzerIn
[default_avatar]
Ich habe die Ausgabedatei entfernt und den Code gekürzt. Der Hauptabschnitt:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my $xml = slurp ( "in.xml" );  # XML aus der Datei in String einlesen

my $struct = XMLin( $xml,    # Macht eine Datenstruktur daraus
             ( forcearray => [ qw/page/ ] ) );

open ( XML , "> out.xml" );     # Öffnet Ausgabedatei für XML

$struct->{links}->{page}->[0]->{time} = time(); # fügt Zeit hinzu.

$xml = XMLout( $struct,     # Macht XML aus der Datenstruktur
         ( xmldecl => 1 ) ); # Zeile: <?xml version='1.0' standalone='yes'?>

print XML $struct;             # Druckt in die Ausgabedatei
print Dumper $struct;   # Druckt

close (XML);


Jetzt bekomme ich zwar mit Dumper die XML - Struktur  auf dem Monitor angezeigt aber in die Datei schreibt es mir jetzt nur den Hashwert. Warum?

Mache ich
Code: (dl )
print XML %{$struct};


schreibt es mir den Namen eines Elementes und den Hashwert in die Datei. Wo ist jetzt mein Fehler bei der Ausgabe?

Danke.

MfG
Schmidtl
 2005-11-07 10:22
#59727 #59727
User since
2005-09-27
14 articles
BenutzerIn
[default_avatar]
@renee: Prinzipiell ist mein Code doch ähnlich. Wo liegt dann mein Problem?
<< |< 1 2 >| >> 15 entries, 2 pages



View all threads created 2005-11-04 14:14.