1

最初に私が何をしているのか、次に私の問題を説明したいと思います。cssファイルをスキャンして、そのすべての内部リンク(主に画像)を取得する必要がありますが、リンクが見つかった行番号を取得する必要があります。

現在、フルートライブラリを使用してファイルを解析しています。また、リンクが見つかった行番号を取得するためにLineNumberReaderを使用していますが、このクラスは誤った行番号をスローします。

例:リンク../../image/bg.gifは行番号350にありますが、クラスLineNumberReaderのメソッドgetLineNumberは490と表示されます。

ですから、正しい方法で私を駆り立てて、LineNumberReaderクラスがそれを行う理由を説明していただければ幸いです。

pd:別の解決策は非常に高く評価されます。

  • 可能性のあるタイプミスをお詫びします。英語は私の母国語ではありません。
4

3 に答える 3

1

別の解決策-これらのパーサー生成ツールを見てください...

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

JavaCCとAntlrは、行番号と列番号を取得する方法を提供します。

あなたの問題の考えられる理由...行番号1...パーサー生成ツールの動作方法が原因である可能性があります...彼らは可能な限り最良の一致を見つけようとします...そのためにいつかトラックバックする必要があります/ストリームを巻き戻します....これが原因で、LineNumberReaderインスタンスが同期しなくなります...。

行番号または列番号を取得する理想的な方法は、ツール自体が提供するメソッドを使用することです。

于 2010-10-05T04:29:44.510 に答える
0

こんにちは@eakbasと@Favoniusご回答ありがとうございます。
私はついに解決策を得ました、多分それは最善ではありませんが、少なくとも私にとってはうまくいきます。
前に述べたように、cssファイルを分析するために、フルートライブラリを使用してパッケージorg.w3c.sacパッケージのDocumentHandlerクラスを実装しました。
そこで、「property」メソッドを実装しました。このメソッドには、プロパティ名、LexicalUnitオブジェクト、およびプロパティに重要なステートメントがあるかどうかを示すブール値の3つのパラメーターがあります。

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

特定のプロパティが見つかった行番号が必要なため、検索を行ったところ、fluteがLexicalUnitインターフェイスを実装するために使用するクラスが行番号(LexicalUnitImp)を保持していることがわかりました。そこで、リフレクションを使用してキャストを作成しました。 LexicalUnitインターフェイスから1つのLexicalUnitImpオブジェクトへ。

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

LexicalUnitImplクラスは「保護」されており、従来の方法でキャストできないため、この方法で実行しました。

class LexicalUnitImpl implements LexicalUnit

注:クラスClassUtilsおよびMethodUtilsは、commons-beanutilsapacheライブラリの一部です。

于 2010-10-07T20:56:21.367 に答える
0

または、解析ライブラリとしてph-cssを使用することもできます。URLを抽出して正しいソース位置を決定する方法の例については、https://github.com/phax/ph-css#code-examplesの「CSSに含まれるすべてのURLにアクセスする」の例を参照してください。

于 2013-05-16T13:34:05.013 に答える