【问题标题】:Parsing a css file with java用java解析一个css文件
【发布时间】:2010-10-04 22:58:31
【问题描述】:

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

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

例如:链接 ../../image/bg.gif 位于第 350 行,但 LineNumberReader 类中的 getLineNumber 方法显示为 490。

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

pd:另一种解决方案将不胜感激。

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

【问题讨论】:

  • 你需要更具体。您可以使用简单(短)输入 css 文件重现您的问题吗?如果是这样,您可以在此处发布代码和输入。然后,很多人将能够提供帮助。

标签: java css parsing line-numbers


【解决方案1】:

另一种解决方案 -- 看看这些解析器生成工具...

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

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

您的问题的可能原因...第一行...可能是因为解析器生成工具的工作方式...他们试图找出最佳匹配...因为有时他们有回溯/倒带流......因此,您的 LineNumberReader 实例将不同步......

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

【讨论】:

    【解决方案2】:

    您好@eakbas 和@Favonius 感谢您的回答。
    我终于找到了一个解决方案,也许它不是最好的,但至少对我有用。
    正如我之前提到的,我使用长笛库来实现包 org.w3c.sac 包的 DocumentHandler 类,以便分析 css 文件。
    所以我实现了 'property' 方法,这个方法有 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 库的一部分。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-06
        • 2013-06-12
        • 2012-02-25
        • 2015-10-26
        • 2011-11-06
        • 2018-07-16
        • 2012-06-22
        • 1970-01-01
        相关资源
        最近更新 更多