使用java解析css文件

首先,我想解释一下我在做什么,然后解释我的问题。 我需要扫描一个css文件并获取其所有内部链接(主要是图像),但我需要获取找到链接的行号。

现在我正在使用长笛库解析文件,它工作得很好我也使用LineNumberReader来获取找到链接的行号,但是这个类抛出了错误的行号。

例如:链接../../image/bg.gif在行号350中,但LineNumberReader类中的方法getLineNumber表示490。

所以,如果你们中的一些人能够以正确的方式驱使我并给我一个可能的解释,为什么LineNumberReader类可以做到这一点,我将不胜感激。

pd:另一个解决方案将非常感谢。

  • 对不起可能的错别字,英语不是我的母语。

另一个解决方案 – 看看这些解析器生成工具……

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

JavaCC和Antlr提供了获取行号和列号的方法。

问题的可能原因……第一行…可能是因为解析器生成工具的工作方式……他们试图找出最好的匹配…因为有时他们必须跟踪/回放流….由于这个你的LineNumberReader实例不同步….

获取行号或列号的理想方法是使用工具本身提供的方法。

您好@eakbas和@Favonius感谢您的回答。
我终于得到了一个解决方案,也许这不是最好的,但至少对我有用。
正如我之前提到的,我使用了长笛库来实现包org.w3c.sac包的DocumentHandler类,以便分析css文件。
所以我实现了’property’方法,这个方法有3个参数,属性名,一个LexicalUnit对象和一个布尔值,表明该属性是否具有重要的声明。

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

由于我需要找到特定属性的行号,我进行了搜索,我可以看到长笛用于实现LexicalUnit接口的类保存行号(它是LexicalUnitImp),所以我用reflection来制作一个从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库的一部分。

或者,您可以使用ph-css作为解析库。 有关如何提取URL并确定正确的源位置的示例,请参阅https://github.com/phax/ph-css#code-examples上的“访问CSS中包含的所有URL”示例。