Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]13036[/thread]

Teile aus XML Dokument extrahieren

Tags: Ähnliche Threads

Leser: 23


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
BratHering
 2009-01-22 13:05
#118236 #118236
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Guten Tag,

mit Hilfe des XML::Parser Moduls möchte ich eine XML-Datei prozessieren. Hier ein Beispieldokument:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
<document>
<article>
Hello
<foo>Foo</foo>
World
</article>
<article>
Hello
<bar>Bar</bar>
World
</article>
<document>

Frage: Wie bekomme ich beim Parsen den gesamten Inhalt eines z.B. article-Tag samt Text und innerer Tags als String extrahiert?

Die Funktionsweise des XML::Parser Moduls ist mir dazu nicht ganz klar. Zwar kann ich Start- bzw. End-Handler definieren, aber wie bekomme ich alles zwischen Start- und End-Tag extrahiert?


Grüße
moritz
 2009-01-22 14:19
#118246 #118246
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Ich habe hier mal eine verwandte Frage, der Thread beinhaltet antworten auf deine Fragen fuer XML::Twig und XML::LibXML. Beide sind eher higher-level als XML::Parser, vielleicht kannst du dich ja damit anfreunden.
BratHering
 2009-01-22 15:01
#118248 #118248
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Das Script möchte ich auf meinem Web-Space hochladen, auf dem mir lediglich die folgenden Module zur Verfügung stehen:

XML::Parser 2.34
XML::Parser::Expat 2.34
XML::Parser::Style::Debug
XML::Parser::Style::Objects
XML::Parser::Style::Stream
XML::Parser::Style::Subs
XML::Parser::Style::Tree
XML::Writer 0.600
murphy
 2009-01-23 00:41
#118267 #118267
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
BratHering+2009-01-22 12:05:40--
[...]
Die Funktionsweise des XML::Parser Moduls ist mir dazu nicht ganz klar. Zwar kann ich Start- bzw. End-Handler definieren, aber wie bekomme ich alles zwischen Start- und End-Tag extrahiert?
[...]


Indem Du neben einem Start- und einem End-Handler auch noch einen Char-Handler definierst:

- Im Start-Handler ueberpruefst Du, ob Dich der Inhalt des geoeffneten Tags interessiert und setzt ein Flag auf wahr.

- Im Char-Handler siehst Du nach, ob der Start-Handler das Flag auf wahr gesetzt hat und speicherst gegebenenfalls den Inhalt. Du solltest dabei bedenken, dass der Char-Handler fuer den Inhalt eines einzigen Tags mehrfach aufgerufen werden kann, wobei jeweils nur Teile des Inhaltes uebergeben werden.

- Im End-Handler setzt Du das Flag auf falsch zurueck.
When C++ is your hammer, every problem looks like your thumb.
Linuxer
 2009-01-23 12:20
#118269 #118269
User since
2006-01-27
3869 Artikel
HausmeisterIn

user image
Hm, bisher habe ich ja die *::Parser Module vermieden. Irgendwie war mir die Art und Weise zu kryptisch, als dass sich mein Hirn da reindenken wollte.
murphys Hinweis hat nun mein Interesse geweckt und ich hab mich mal an einer Lösung versucht:

Code (perl): (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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#! /usr/bin/perl
use strict;
use warnings;
use XML::Parser;

{
    my $is_article = 0;

    sub handle_start {
        my ( $expat, $element, %attr ) = @_;

        if ( $element eq 'article' ) {
            $is_article = 1;
        }
        elsif ( $is_article ) {
            print $expat->original_string;
        }
    }

    sub handle_end {
        my ( $expat, $element, %attr ) = @_;

        if ( $element eq 'article' ) {
            $is_article = 0;
        }
        elsif ( $is_article ) {
            print $expat->original_string;
        }
    }

    sub handle_char {
        my ( $expat, $string ) = @_;

        #print $expat->original_string if $is_article;
        print $string if $is_article;
    }
}


my $x = XML::Parser->new();

$x->setHandlers(
    Start => \&handle_start,
    End   => \&handle_end,
    Char  => \&handle_char,
);

$x->parse( *DATA );

__DATA__
<document>
    <article>
        Hello
        <foo>Foo</foo>
        World
    </article>
    <article>
        Hello
        <bar>Bar</bar>
        World
    </article>
</document>
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
BratHering
 2009-01-23 16:19
#118272 #118272
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Wow, jetzt ist es mir auch klar wie das zu funktionieren hat. Vielen Dank euch beiden.

Grüße
BratHering
 2009-03-29 13:06
#119924 #119924
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Hallo,
zum Thema XML::Parser habe ich noch eine Frage:

Wenn das XML-Dokument nicht korrekt ist, dann bricht der XML-Parser das gesamte Skript mit einer entsprechenden Fehlermeldung ab. Im PerlDoc habe ich keinen Hinweis darauf finden können, wie ich selber auf z.B. Rückgabewerte reagieren könnte? Ist das überhaupt möglich, dass der XML-Parser z.B. entweder 0 oder 1 zurückguibt, für XML-Dokument korrekt oder nicht?


Grüße
renee
 2009-03-29 14:10
#119927 #119927
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
eval{
    # try to parse xml file
    1;
} or do {
   # do exception handling
};
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/
BratHering
 2009-03-29 18:59
#119928 #119928
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Oh :-O

Wofür steht das 1; statement im eval Block?
renee
 2009-03-29 19:06
#119929 #119929
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Damit im "nicht-Fehler"-Fall auf jeden Fall ein "wahrer" Wert zurückgeliefert wird.

Vgl:
Code (perl): (dl )
1
2
3
eval{ test() } or die "Fehler in test(): $@";

sub test{ 0 }


vs.
Code (perl): (dl )
1
2
3
eval{ test(); 1; } or die "Fehler in test(): $@";

sub test{ 0 }
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/
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2009-01-22 13:05.