2010-10-04 72 views
1

首先我想解釋我在做什麼,然後解決我的問題。 我需要掃描一個css文件並獲取它的所有內部鏈接(主要是圖片),但我需要獲取鏈接所在的行號。用java解析一個css文件

現在我正在使用長笛庫解析文件,它工作得很好,我也正在使用LineNumberReader爲了獲得鏈接被找到的行號,但是這個類拋出一個不正確的行號。

例如:鏈接../../image/bg.gif是行號350,但在類中的方法getLineNumber LineNumberReader說490

因此,我將不勝感激,如果你們中的一些可以以正確的方式驅動我,給我一個可能的解釋,爲什麼LineNumberReader類會這樣做。

pd:另一種解決方案將非常感激。

  • 對不起,可能的錯別字,英語不是我的母語。
+1

你需要更具體。你能用一個簡單的(短)輸入CSS文件重現你的問題嗎?如果是這樣,你可以在這裏發佈代碼和輸入。然後,很多人將能夠提供幫助。 – emrea 2010-10-04 23:30:30

回答

0

嗨@eakbas和@Favonius感謝您的回答。
我終於得到了一個解決方案,也許它不是最好的,但至少對我有用。
正如我前面提到的,我使用了長笛庫來實現包org.w3c.sac包的DocumentHandler類,以便分析css文件。
所以我實現了'屬性'方法,這個方法有3個參數,屬性名稱,一個LexicalUnit對象和一個布爾值,表示該屬性具有重要的聲明與否。

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

因爲我需要在那裏特定屬性的行號,我做了一個搜索,我看得出來,那笛用來實現LexicalUnit接口的類持有的行號(這是LexicalUnitImp),所以我使用反射來將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); 

我做到了以這種方式,因爲該類LexicalUnitImpl是「保護」,我不能以傳統方式投放。

class LexicalUnitImpl implements LexicalUnit 

注意:類ClassUtils和MethodUtils是commons-beanutils apache庫的一部分。

1

另一個解決方案 - 看一看這些解析器生成工具...

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

JavaCC的和ANTLR的提供一種獲取行號和列號的方法。

您的問題的可能原因......第一行......可能是因爲解析器生成工具的工作方式......他們試圖找出最佳可能的匹配......對於某些時候他們必須回溯/倒回流....因此,LineNumberReader實例將不同步....

獲取行號或列號的理想方法是使用工具本身提供的方法..