Question

Je veux d'abord expliquer ce que je fais et mon problème. Je dois analyser un fichier css et obtenir tous ses liens internes (images principalement), mais je dois obtenir le numéro de ligne où les liens ont été trouvés.

En ce moment je suis analyse les fichiers en utilisant la bibliothèque de la flûte et il fonctionne très bien, je suis également en utilisant LineNumberReader afin d'obtenir le numéro de ligne où un lien a été trouvé, mais cette classe jette un numéro de ligne incorrect.

Par exemple:. ../../Image/bg.gif le lien est le numéro de la ligne 350, mais la méthode getLineNumber dans la LineNumberReader de classe dit 490

Je vais apprécier si certains d'entre vous peut me conduire par la bonne façon et me donner une explication possible pourquoi la classe LineNumberReader fait.

pd:. Une autre solution sera très apprécié

  • désolé les fautes de frappe des POSSIBLES, l'anglais est pas ma langue maternelle.
Était-ce utile?

La solution 2

Hi @eakbas et @Favonius Merci pour votre réponse.
J'ai finalement obtenu une solution, peut-être ce ne sont pas les meilleurs, mais au moins fonctionne pour moi.
Comme je l'ai mentionné avant utilisé la bibliothèque de flûte pour mettre en œuvre la classe DocumentHandler du paquet paquet org.w3c.sac afin d'analyser le fichier css.
Je mis en œuvre la méthode « propriété », cette méthode a 3 paramètre, le nom de la propriété, un objet LexicalUnit et un booléen indiquant que la propriété a l'importante déclaration ou non.

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

Comme je l'ai besoin du numéro de la ligne où une propriété spécifique se trouve, je fait une recherche et je pouvais voir que la classe qui utilise la flûte pour mettre en œuvre l'interface LexicalUnit contient le numéro de la ligne (il est LexicalUnitImp), donc je réflexion à faire une pièce coulée à partir de l'interface à un objet LexicalUnit LexicalUnitImp.

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

Je l'ai fait de cette façon parce que la classe LexicalUnitImpl est « protégé » et je ne peux pas jeter d'une manière traditionnelle.

class LexicalUnitImpl implements LexicalUnit

Note:. Les ClassUtils de classe et MethodUtils font partie des communes-BeanUtils apache bibliothèque

Autres conseils

Une autre solution - Jetez un oeil à ces outils de production d'analyseur ...

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

Le JavaCC et Antlr fournissent un moyen d'obtenir le numéro de ligne et le numéro de colonne.

La raison possible pour le votre problème ... le numéro de ligne un ... pourrait être à cause de l'analyseur générant ainsi le travail d'outils ... Ils essaient de trouver le meilleur match possible ... pour que quelque temps ils ont à trackback / retour rapide du flux .... et de ce fait votre instance LineNumberReader va désynchronisés ....

La façon idéale pour obtenir la ligne ou le numéro de colonne est d'utiliser les méthodes fournies par l'outil lui-même ..

Vous pouvez également utiliser ph-css comme une bibliothèque d'analyse syntaxique. S'il vous plaît voir l'exemple « Visitez toutes les URL contenues dans un CSS » https://github.com / Phax / ph-# Code css-exemples pour un exemple de la façon d'extraire les URL et déterminer la position de la source correcte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top