Maik Görgens: XML-Parser, der bestimmten Weg parst

Hallo!

Gibt es einen XML-Parser für Perl, der nur einen bestimmten Weg verfolgt, den ich vorher festgelegt habe. Es wird halt nur der Teil geparst, den ich brauche, und der Rest nicht gespeichert, wodurch eine Geschwindigkeitsoptimierung möglich ist. Den 'Weg' würde ich vorher mit Element-Namen und Attrirbut/Wert-Paaren festlegen können.

Ich frage, weil ich gerade dabei bin, ein entsprechendes Modul zu entwickeln, und das ja sein lassen könnte, wenn es sowas bereits gibt.

Viele Grüße
  Maik Görgens

P.S.: Sorry, das ich's auch im cForum gepostet habe, aber wollte das andere Forum mal ausprobieren, aber hier schauen vielleicht doch mehr vorbei...

  1. Gibt es einen XML-Parser für Perl, der nur einen bestimmten Weg verfolgt, den ich vorher festgelegt habe. Es wird halt nur der Teil geparst, den ich brauche, und der Rest nicht gespeichert, wodurch eine Geschwindigkeitsoptimierung möglich ist.

    Völlig unmöglich, alles was möglich wäre, ist ab einem bestimmten Punkt aufzuhören, das Dokument zu verarbeiten; um zu finden, was du im Dokument suchen lässt, muss das Dokument ja entsprechend verarbeitet werden. In sehr konkreten Umgebungen kann sowas vielleicht funktionieren und vielleicht einen kleinen Vorteil bringen, aber das steht in keinem Verhältnis zum Entwicklungs- und Wartungsaufwand.

  2. Halihallo

    Gibt es einen XML-Parser für Perl, der nur einen bestimmten Weg verfolgt, den ich vorher festgelegt habe. Es wird halt nur der Teil geparst, den ich brauche, und der Rest nicht gespeichert, wodurch eine Geschwindigkeitsoptimierung möglich ist. Den 'Weg' würde ich vorher mit Element-Namen und Attrirbut/Wert-Paaren festlegen können.

    Ich schliesse mich der Aussage von Björn an, habe jedoch noch einen Vorschlag, den du vielleicht verwenden könntest:

    Verwende XML::Parser oder XML::Parser::Expat, der ist eventorientiert und sehr schnell. Es wäre möglich intern durch eigens dafür geschriebene Funktionen einen Tree aufzubauen, der nach jedem Element untersucht wird, ob die gewünschten Daten eingelesen wurden; falls dem so ist, wird das parsing abgebrochen. Ich bin jedoch auch der Meinung, dass der Aufwand den Nutzeffekt übersteigt.

    ----
    my $xml_src = '<el1><t>bla</t><el2><wanted n="v2 /></el2><t/></el1>';
    $parser = new XML::Parser(Handlers => {Start => &start} );
    $parser->parse($xml_src);

    my $pos = 0;

    sub start {
       my ($expat, $element, %attrs) = @_;
       if ($element eq 'el1') { $pos = 1 }
       if (($element eq 'el2') && ($pos==1)) { $pos = 2; }
       if (($element eq 'wanted') && ($pos==2)) {$pos = 3; }

    if ($pos == 3) {
          &got_it_already( $attrs{'n'} );
          # aber wie brechen wir das ganze jetzt ab?
       }
    }
    ----

    Also hier wird die Funktion got_it_already vor dem einlesen von <t/> aufgerufen (sollte zumindest, ich hab's nicht getestet). Aber nur um einige ns zu sparen, müsste man hier schon 20 Zeilen mehr schreiben... Naja, eben, Nutzen?

    Viele Grüsse

    Philipp