Frage

Zuerst möchte ich erklären, was mache ich dann mein Problem. Ich brauche eine CSS-Datei zu scannen und erhalten alle seine internen Verbindungen (hauptsächlich Bilder), aber ich brauche die Zeilennummer zu erhalten, wo die Verbindungen gefunden wurden.

Im Moment bin ich Parsen der Dateien Flöte Bibliothek und es funktioniert sehr gut auch ich LineNumberReader um bin mit der Zeilennummer zu erhalten, in dem eine Verbindung gefunden wurde, aber diese Klasse wirft eine falsche Zeilennummer.

Zum Beispiel:. Der Link ../../image/bg.gif in der Zeile Nummer 350, aber die Methode getLineNumber in der Klasse LineNumberReader ist, sagt 490

So werde ich es begrüßen, wenn einige von Ihnen, mich durch die richtige Art und Weise fahren kann und geben Sie mir eine mögliche Erklärung, warum die LineNumberReader Klasse tut es.

pd:. Eine andere Lösung wird sehr zu schätzen wissen werden,

  • leider der possibles Tippfehler, Englisch ist nicht meine Muttersprache.
War es hilfreich?

Lösung 2

Hallo @eakbas und @Favonius Vielen Dank für Ihre Antwort.
Ich habe endlich eine Lösung, vielleicht ist es nicht die beste, aber zumindest funktioniert für mich.
Wie ich bereits erwähnte, bevor ich die Flöte Bibliothek verwendet, um die Document Klasse des Pakets org.w3c.sac Pakets zu implementieren, um die CSS-Datei zu analysieren.
Also habe ich implementiert, um die ‚Eigenschaft‘ Methode, diese Methode hat drei Parameter, den Namen der Eigenschaft, ein LexicalUnit Objekt und eine Bedingung, die anzeigt, dass die Eigenschaft, die wichtige Aussage hat oder nicht.

public void property(String property, LexicalUnit lexicalUnit, boolean important)

Als ich die Zeilennummer benötigen, wo eine bestimmte Eigenschaft gefunden wird, ich eine Suche gemacht und ich konnte sehen, dass die Klasse, die Flöten Anwendungen die LexicalUnit Schnittstelle zu implementieren, um die Zeilennummer hält (es ist LexicalUnitImp), so habe ich Reflexion zu macht ein Casting von LexicalUnit Schnittstelle zu einem LexicalUnitImp Objekt.

Class<?> clazz = ClassUtils.getClass("org.w3c.flute.parser.LexicalUnitImpl");
Object lexicalObject = clazz.cast(lexicalUnit);
Integer line = (Integer)MethodUtils.invokeMethod(lexicalObject, "getLineNumber", null, null);

Ich habe es auf diese Weise, weil die Klasse LexicalUnitImpl ist ‚geschützt‘ und ich kann werfen es nicht auf traditionelle Weise.

class LexicalUnitImpl implements LexicalUnit

. Hinweis: Die Klasse ClassUtils und MethodUtils ist Teil der commons-BeanUtils Apache Bibliothek

Andere Tipps

Eine weitere Lösung - Werfen Sie einen Blick auf diese Parser Erzeugungs Tools ...

  1. Antlr - http://www.antlr.org/grammar/1240941192304/css21. g
  2. JavaCC - http://sourceforge.net/projects/cssparser/

Die JavaCC und Antlr bieten eine Möglichkeit, die Zeilennummer und die Spaltennummer zu erhalten.

Der mögliche Grund für die Ihr Problem ... die Linie eine Nummer ... wegen der Art und Weise Parser Erzeugungs Tools Arbeit sein könnte ... Sie versuchen, die bestmögliche Übereinstimmung, um herauszufinden, ... für diese irgendwann haben sie zu Trackbacks / Rücklauf der Strom .... und wegen diesem Fall Ihre LineNumberReader of sync geht aus ....

Der ideale Weg, Zeilen- oder Spaltennummer zu erhalten, ist die Methoden durch das Werkzeug selbst zu nutzen ..

Alternativ können Sie mit ph-CSS als Parsing-Bibliothek. Bitte beachten Sie das Beispiel „Besuchen Sie alle URLs in einem CSS enthalten“ unter https://github.com / phax / ph-css # -Code-Beispiele für ein Beispiel, wie URLs zu extrahieren und die korrekte Quellenposition bestimmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top