Font
[thread]8683[/thread]

Probleme mit XML::Simple

Readers: 2


<< >> 7 entries, 1 page
bo
 2007-01-25 15:52
#73599 #73599
User since
2006-05-09
76 articles
BenutzerIn
[default_avatar]
Ich habe folgendes Problem. Mit XML::Simple wird eine Datenstruktur gespeichert und von einem anderen Script wieder eingelesen.
Das XML-File hat diesen Aufbau:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<opt>
<system_1>
<forms name="main_menu">
...
</forms>
<forms name="disconnect">
...
</forms>
...
</system_1>
<system_2>
<forms name="whatever">
...
</forms>
...
</system_2>
</opt>


Das Einlesen und das Verarbeiten der Datei funktionierte die ganze Zeit einwandfrei. Die Weiterverarbeitung geschieht über den Form-Namen.

Code: (dl )
1
2
3
4
5
6
7
my $xs = new XML::Simple();
my $tree = $xs->XMLin('vxml_tree.xml');
my $vxml = $tree->{system_1};
foreach my $form (sort keys %{$vxml->{forms}})
{
...
}


Doch plötzlich hat die XML-Datei den weiter unten gezeigten Aufbau und ich komme nicht mehr wie zuvor an meine 'forms' ran.
Wenn ich nun stattdessen
Code: (dl )
foreach my $form (sort keys %{$vxml})

benutze, bekomme ich zwar wieder meine forms, allerdings auch eine form mit dem namen 'name' und die existiert nicht.
Auszug DataDumper:
'name' => 'forms'
'forms' => {}

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<opt>
<system_1 name="forms">
<main_menu>
...
</main_menu>
<disconnect>
...
</disconnect>
</system_1>
<system_2 name="forms">
<whatever>
...
</whatever>
</system_2>


Das Script, welches das xml-file schreibt, ist schon etwas älter und meines Wissens auch seitdem unverändert. Also ich blicke im Moment nicht mehr durch...

Hat vielleicht jemand eine Idee, was ich tun muss, damit ich wieder das ursprüngliche Format erhalte?
renee
 2007-01-25 16:07
#73600 #73600
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Kannst Du eine "Dummy"-XML-Datei erstellen und ein kurzes Script posten, das den Fehler reproduziert?
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/
bo
 2007-01-25 16:43
#73601 #73601
User since
2006-05-09
76 articles
BenutzerIn
[default_avatar]
hier script und dump... nach dem einlesen ist der key 'forms' weg, dafür gibts nen key 'name' mit value 'forms'
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
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;

my @forms = qw(first second third);
my $tree;
my $vxml;

my $filename = 'vxml_tree.xml';

$vxml->{forms}->{$_} = ['dummy', { more_dummy => 'more' }] for (@forms);
$tree->{system_1} = $vxml;

print Dumper $tree;

my $xs = new XML::Simple();
my $xml = $xs->XMLout($tree);
open my $fh, '>', $filename or die $!;
print $fh $xml;
close $fh;

$tree = $xs->XMLin($filename);

print Dumper $tree;

...und die ausgabe
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
43
44
45
46
47
$VAR1 = {
'system_1' => {
'forms' => {
'first' => [
'dummy',
{
'more_dummy' => 'more'
}
],
'second' => [
'dummy',
{
'more_dummy' => 'more'
}
],
'third' => [
'dummy',
{
'more_dummy' => 'more'
}
]
}
}
};
$VAR1 = {
'system_1' => {
'first' => [
'dummy',
{
'more_dummy' => 'more'
}
],
'second' => [
'dummy',
{
'more_dummy' => 'more'
}
],
'third' => [
'dummy',
{
'more_dummy' => 'more'
}
],
'name' => 'forms'
}
};
\n\n

<!--EDIT|bo|1169736420-->
bo
 2007-01-25 17:01
#73602 #73602
User since
2006-05-09
76 articles
BenutzerIn
[default_avatar]
ich glaube, ich hab's gefunden...

Code: (dl )
my $xs = new XML::Simple(ForceArray => 1);


so sind zumindest die dumps gleich... werde es mal gleich in meine scripts einbauen und testen
renee
 2007-01-25 17:04
#73603 #73603
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Mach mal:
Code: (dl )
my $xml = $xs->XMLout($tree, NoAttr => 1);


Damit wird verhindert, dass 'forms' zu einem Attribut von 'system_1' wird.
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/
bo
 2007-01-25 17:45
#73604 #73604
User since
2006-05-09
76 articles
BenutzerIn
[default_avatar]
@renee
aber ich möchte ja, dass 'forms' ein attribut von 'system_1' wird (bleibt), um nach dem einlesen des xml-files so auf die einzelnen elemente zugreifen zu können:

Code: (dl )
print qq($_\n) for keys %{$tree->{system_1}->{forms}};
bo
 2007-01-26 11:53
#73605 #73605
User since
2006-05-09
76 articles
BenutzerIn
[default_avatar]
Weder ForceArray => 1 noch NoAttr => 1 haben das gewünschte Ergebnis gebracht :(

Ich habe mich deshalb damit abgefunden und verarbeite das xml jetzt eben so...

Code: (dl )
1
2
3
4
5
foreach my $form (sort keys %{$vxml})
{
next if ('name' eq $form);
...
}
<< >> 7 entries, 1 page



View all threads created 2007-01-25 15:52.