Javaを使用してCSSファイルを解析します
-
27-09-2019 - |
質問
まず、私が何をしているのか、それから私の問題を説明したいと思います。 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の一部です。
他のヒント
別 解決策 - これらのパーサー生成ツールを見てください...
- antlr- http://www.antlr.org/grammar/1240941192304/css21.g
- Javacc- http://sourceforge.net/projects/cssparser/
JavaccとANTLRは、行番号と列番号を取得する方法を提供します。
あなたの問題の可能性のある理由...ラインナンバーワン...パーサー生成ツールが機能する方法のためである可能性があります...彼らは可能な限り最高の試合を見つけようとします...ストリームを巻き戻します....そしてこのため、LinEnumberReaderインスタンスは同期していません。
ラインまたは列番号を取得する理想的な方法は、ツール自体が提供するメソッドを使用することです。
または、使用することもできます PH-CSS 解析ライブラリとして。 「CSSに含まれるすべてのURLにアクセス」の例を参照してください https://github.com/phax/ph-css#code-examples URLを抽出し、正しいソース位置を決定する方法の例については。