質問

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

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

たとえば、リンク../../image/bg.gifはライン番号350にありますが、クラスのLinenumberReaderのメソッドGetLineNumberは490と言います。

ですから、あなたの何人かが正しい方法で私を運転してくれて、Linenumberreaderクラスがそれをする理由を説明してくれたら感謝します。

PD:別のソリューションは非常に感謝しています。

  • 申し訳ありませんが、可能性のあるタイプミス、英語は私の母国語ではありません。
役に立ちましたか?

解決 2

こんにちは@eakbasと@favoniusあなたの答えをありがとう。
私はついに解決策を手に入れました。多分それは最高ではありませんが、少なくとも私にとってはうまくいきます。
前に述べたように、フルートライブラリを使用して、CSSファイルを分析するために、パッケージorg.w3c.sacパッケージのドキュメントハンドラークラスを実装しました。
したがって、「プロパティ」メソッドを実装しました。この方法には、プロパティが重要なステートメントを持っているかどうかを示す3つのパラメーター、プロパティ名、lexicalunitオブジェクト、ブール値があります。

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

特定のプロパティが見つかった行番号が必要なので、検索し、フルートが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

注:クラスのクラスチルとメソジチルは、Commons-Beanutils Apache Libraryの一部です。

他のヒント

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

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

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

あなたの問題の可能性のある理由...ラインナンバーワン...パーサー生成ツールが機能する方法のためである可能性があります...彼らは可能な限り最高の試合を見つけようとします...ストリームを巻き戻します....そしてこのため、LinEnumberReaderインスタンスは同期していません。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top