x-VieW: XML mit PERL Split();

Hallo Leute,

Ich bin seit einigen Tegen daran, die einzelnen Werte einer XML-Datei in Variablen zu speichern. Ich suche dafür Infos, leider ohne Erfolg. Wie kann ich eine XML-Datei mit Perl Splitern??? Geht's überhaupt??? Oder gibt's dafür andere Methoden?
Ich bin euch sehr dankbar für jeden Hinweis.

Gruss
x-VieW

  1. Hi,

    Ich bin seit einigen Tegen daran, die einzelnen Werte einer XML-Datei in Variablen zu speichern. Ich suche dafür Infos, leider ohne Erfolg. Wie kann ich eine XML-Datei mit Perl Splitern?

    wie kannst Du XML-Daten _unabhängig_ von der Programmiersprache splitten? Gar nicht, denn die Struktur ist zu komplex.

    Geht's überhaupt?

    Diese Frage in Bezug auf Perl zu stellen ist langweilig, weil die Antwort ziemlich klar ist ;-)

    Oder gibt's dafür andere Methoden?

    Für beinahe jedes komplexe Problem gibt es für Perl ein oder mehrere Module. Jedes Perl-Modul findest Du bei CPAN, http://www.cpan.org/.

    Cheatah

    --
    X-Will-Answer-Email: No
    1. Hi Cheatah,

      Ich bin letzten Tagen immer auf XML::parser und XML::DOM aufgstossen. weist du zufälligerweise, ob mit XML::parser oder XML::DOM die Möglichkeit gibt, die XML-Tags von dessen Werten zu trennen???
      Ich danke dir für die Hilfe.

      Gruss
      x-VieW

      1. Hi,

        Ich bin letzten Tagen immer auf XML::parser und XML::DOM aufgstossen. weist du zufälligerweise,

        ich hatte bisher noch nicht das Vergnügen, mit diesen Modulen zu arbeiten; aber es sind genau die, die ich meinte :-)

        ob mit XML::parser oder XML::DOM die Möglichkeit gibt, die XML-Tags von dessen Werten zu trennen???

        Was meinst Du mit "dessen Werten"?

        Cheatah

        --
        X-Will-Answer-Email: No
        1. Hi Cheatah,

          ob mit XML::parser oder XML::DOM die Möglichkeit gibt, die XML-Tags von dessen Werten zu trennen???

          Was meinst Du mit "dessen Werten"?

          Also z.B.
          -----------
          <autor>
            <name>Muster</name>
            <alter>26</alter>
          </autor>
          -----------
          Ich möchte der Name des Autors ("Muster") und sein Alter ("26") von den XML-Tags trennen und sie In Variablen speichern.

          my $name = "Muster";
          my $alter = "26";

          Ich danke dir und Gruss
          x-VieW

          1. Hallo x-VieW

            Es gibt ein tolles Buch von O'Reilly zu diesem Thema (Titel: Perl & XML).

            Darin ist Hautsächlich der Umgang mit den Modulen XML::Parser und XML::LibXML. Es wird erklärt wie man mit den Modulen an die Inhalte oder Attribute von XML-Daten kommt.

            Ich mach mir mal die Mühe ein Stückchen Quelltext aus diesem Buch abzutippen. Es handelt sich um einen eventorientierten XML-Prozessor:

            use XML::Parser;
            my $parser = XML::Parser->new( Handlers => { Start=>&handle_start, End=>&handle_end,});
            $parser->parsefile(shift @ARGV);
            my @element_stack;

            sub handle_start {
             my ($expat, $element, %attrs ) = @_;
             my $line = $expat->current_line;
             print "Ein Element $element beginnt in Zeile $line!\n";
             push( @element_stack, { element=>$element, line=>$line });
             if (%attrs) {
              print"Das Element besitzt die folgenden Attribute;\n";
              while (my($key,$value) = each(%attrs)) {
               print "\t$key => $value\n";
              }
             }
            }

            sub handle_end {
             my ($expat, $element) = @_;
             my $element_record = pop( @element_stack);
             print "Ein Element $element wird beendet, es begann in Zeile ", $$element_record{line}, ".\n";
            }

            Das Buch kann ich nur wärmstens Empfehlen, da das Arbeiten mit XML doch ein wenig komplex sein kann. Ansonsten kann ich Dir auf jeden Fall auch die Dokumentation der Module ans Herz legen.

            greets
            myMojito

            --
            -------------------------------------------
            Mode ist eine Variable, Stil eine Konstante
            1. Hi myMojito,

              Ich danke dir für die Tipps. Ich werd's wohl mich dahinter setzen ;-)

              Gruss
              x-VieW

            2. Hi,

              aus Interesse:

              print "Ein Element $element beginnt in Zeile $line!\n";

              wird bei enthaltenem Text dann hier "Ein Element CDATA beginnt ..." ausgegeben?

              Cheatah

              --
              X-Will-Answer-Email: No
              1. Hier eine mögliche Ausgabe des XML-Prozessors:

                Ein Element spam-document beginnt in Zeile 2!
                Das Element besitzt die folgenden Attribute:
                   version => 3.5
                   timestamp => 2002-05-13 15:33:45
                Ein Element customer beginnt in Zeile 4!
                Ein Element first-name beginnt in Zeile 5!
                Ein Element first-name wird beendet, es begann in Zeile 5.
                .
                .
                .

                Bei diesem eventorientierten Beispiel aus dem Buch werden nur die Events Start und End behandelt. Auf die Textinhalte zwischen den Tags hat man mit dem Handler "Char" zugriff. Fazu müsste man das XML::Parser-Modul wie folgt aufrufen:

                my $parser->new( Handlers => {Start=>&handle_start, End=>\handle_end, Char=>&handle_char,});

                Das Unterprogramm kann die wie folgt aussehen:

                sub handle_char {
                 my ($expat, $text) = @_;
                 print "Der Datensatz enthält: $text";
                }

                Das Modul XML::Parser beherrscht neben den Eventsrömen auch eine baumorientierte Verarbeitung. Dabei wird das gesamte XML-Dokument mit Hilfe von Arrays und Hashes repräsentiert.

                greets
                myMojito

                --
                -------------------------------------------
                Mode ist eine Variable, Stil eine Konstante
                1. Hi,

                  Bei diesem eventorientierten Beispiel aus dem Buch werden nur die Events Start und End behandelt. Auf die Textinhalte zwischen den Tags hat man mit dem Handler "Char" zugriff.

                  aha, das wollte ich wissen, danke!

                  Das Modul XML::Parser beherrscht neben den Eventsrömen auch eine baumorientierte Verarbeitung.

                  Oh, beide Varianten im selben Modul? Das ist interessant. Weißt Du zufällig, ob für die Baumstruktur eine interne Handler-Sammlung verwendet wird? (Wäre eigentlich logisch...)

                  Cheatah

                  --
                  X-Will-Answer-Email: No
                  1. Oh, beide Varianten im selben Modul? Das ist interessant. Weißt Du zufällig, ob für die Baumstruktur eine interne Handler-Sammlung verwendet wird? (Wäre eigentlich logisch...)

                    EIn Beispiel um XML::Parser im Baummodus zu verwenden:

                    use XML::Parser;
                    $parser = new XML::Parser( Style => 'Tree' );
                    my $tree = $parser->parsefile( shift @ARGV );

                    Ausgabe der Baunstruktur

                    use Data::dumper;
                    print Dumper( $tree );

                    Ein bißchen einfacher Handzuhaben ist das Modul XML::Simple. Die Ausgabe der Datenstruktur ist ein wenig einfacher aufgebaut.

                    Es haben sich 2 Standards herauskristalliesiert, um sich durch eine Baumstruktur durchzunavigieren. Zu einem XML::DOM, das ähnlich aufgebaut ist wie das DOM unter JavaScript (Knoten, Eltern, Kinder, Geschwister). Zum anderen gibt es XML::XPath, das wie ein Verzeichnis aufgebaut ist ( /root/Knoten_1/Knoten_2/Element ). Beide Module bauen auf XML::Parser auf, welches wiederum auf expat aufbaut.

                    Ich habe mich bisher auch nur theoretsich eingelesen und kann daher das O'Reilly-Buch "Perl & XML" nur wärmstens weiterempfehlen.

                    greets
                    myMojito

                    --
                    -------------------------------------------
                    Mode ist eine Variable, Stil eine Konstante
                    1. Hi,

                      EIn Beispiel um XML::Parser im Baummodus zu verwenden:

                      danke, das sagt nur leider wenig darüber, wie das Modul _intern_ arbeitet ;-) Ist auch nicht so wichtig, ich hatte nur die vage Hoffnung, Du würdest es zufällig wissen.

                      Es haben sich 2 Standards herauskristalliesiert, um sich durch eine Baumstruktur durchzunavigieren. Zu einem XML::DOM, das ähnlich aufgebaut ist wie das DOM unter JavaScript (Knoten, Eltern, Kinder, Geschwister). Zum anderen gibt es XML::XPath, das wie ein Verzeichnis aufgebaut ist ( /root/Knoten_1/Knoten_2/Element ).

                      Ideal für XSL(T), wie ich vermute. Hast Du in dieser Richtung Erfahrung?

                      Ich habe mich bisher auch nur theoretsich eingelesen und kann daher das O'Reilly-Buch "Perl & XML" nur wärmstens weiterempfehlen.

                      Merci!

                      Cheatah

                      --
                      X-Will-Answer-Email: No