MrSpoocy: XML::Simple problem mit End-Tag losen Tags ( <irgendwas/> )

Hi,

ich habe XML Dateien welche ich mit einem Perl Script Parse und das sehr simpel aufgebaut ist.

<name>Mein Name</name>  
<irgendwas>anderes</irgendwas>  
<alter/>  
<beruf>Keine Ahnung</beruf>
  
my $xmlObj = XML::Simple->new();  
my $ref = $xmlObj->XMLin($xmlStream);  
  
print "Name: ".$ref->{'name'}."\n";  

so, das geht an sich auch. Problem macht der Tag "<alter/>". Wenn ich mit Dumper mal $ref ausgeben erhalte ich
'alter' => {}
und da liegt das Problem drin. Wie soll ich denn nun prüfen ob alter vielleicht einen wert hat ? Denn es könnte auch sein das in der XML folgendes steht

<name>Mein Name</name>  
<irgendwas>anderes</irgendwas>  
<alter>25</alter>  
<beruf>Keine Ahnung</beruf>

oder der Tag könnte sogar komplett fehlen.
Mir würde es gefallen wenn <alter/> dann als 'alter' => '' erscheint. So kann ich auch gegebenen falls prüfen ob es defined ist.

Einer eine Idee ob es dafür eine Option oder eine Art Filter gibt ?

  1. Hi,

    ich habe XML Dateien welche ich mit einem Perl Script Parse und das sehr simpel aufgebaut ist.

    Dein XML-Parser-Problem kann ich nicht lösen, aber malso nebenbei gefragt: Ist es zwingend XML, was Du da bekommst? Wie sieht denn der Übertragungsweg aus, isses HTTP, FTP...? Und welche Programme sollen da miteinander reden, also Daten austauschen?

    Schöne Grüße,
    Horst Hacke

    1. Hi,

      ich habe XML Dateien welche ich mit einem Perl Script Parse und das sehr simpel aufgebaut ist.

      Dein XML-Parser-Problem kann ich nicht lösen, aber malso nebenbei gefragt: Ist es zwingend XML, was Du da bekommst? Wie sieht denn der Übertragungsweg aus, isses HTTP, FTP...? Und welche Programme sollen da miteinander reden, also Daten austauschen?

      Schöne Grüße,
      Horst Hacke

      Also es ist http/https und es ist Zwingend XML.
      Die Option "SuppressEmpty" ist schon mal ein Anfang. Jedoch kann ich dann nicht unterscheiden ob es  <irgendwas/> oder <irgendwas></irgendwas> oder "nicht vorhanden" war.

      Hier noch mal genau was am Ende raus kommen soll:

      <irgendwas/> zu $ref->{irgendwas} = undef;
      <irgendwas></irgendwas> zu $ref->{irgendwas} = '';
      <irgendwas>abc</irgendwas> zu $ref->{irgendwas} = 'abc';
      tag nicht vorhanden zu keine ref vorhanden. Sodas ich mit  "defined" prüfen kann.

      mfg Spoocy

      1. Hier noch mal genau was am Ende raus kommen soll:

        <irgendwas/> zu $ref->{irgendwas} = undef;
        <irgendwas></irgendwas> zu $ref->{irgendwas} = '';

        Beides ist unless($ref->{irgendwas})

        <irgendwas>abc</irgendwas> zu $ref->{irgendwas} = 'abc';

        if($ref->{irgendwas})

        tag nicht vorhanden zu keine ref vorhanden. Sodas ich mit  "defined" prüfen kann.

        oder besser mit exists

        Struppi.

      2. Hier noch mal genau was am Ende raus kommen soll:

        <irgendwas/> zu $ref->{irgendwas} = undef;
        <irgendwas></irgendwas> zu $ref->{irgendwas} = '';

        Das geht nicht, in XML sind <irgendwas/> und <irgendwas></irgendwas> semantisch identisch; der Parser darf sie nicht auseinanderhalten.

        1. Hier noch mal genau was am Ende raus kommen soll:

          <irgendwas/> zu $ref->{irgendwas} = undef;
          <irgendwas></irgendwas> zu $ref->{irgendwas} = '';

          Das geht nicht, in XML sind <irgendwas/> und <irgendwas></irgendwas> semantisch identisch; der Parser darf sie nicht auseinanderhalten.

          Leider scheint das dann ein Fehler des Ausgabeserver zu sein. Denn in dem Fall ist es unterschiedlich. mit <irgendwas/> will man mir sagen das dies zutrifft. Wohin ein nicht zutreffen einfach ein fehlen des Tag bedeutet. Aber an anderer stelle bedeutet <irgendwas></irgendwas> das die Person auch einen  zustand nicht hat anderenfalls würde etwas drin stehen. Daher brauch ich diese Unterscheidung :(

          1. in XML sind <irgendwas/> und <irgendwas></irgendwas> semantisch identisch; der Parser darf sie nicht auseinanderhalten.
            Leider scheint das dann ein Fehler des Ausgabeserver zu sein.

            Dasselbe gilt natürlich für das Verfassen von XML. Du musst den Produzenten die Situation erklären und sie darauf hinweisen, dass sie XML nicht standardkonform benutzen.