2010-10-04 5 views
1

Сначала я хочу объяснить, что я делаю, а затем моя проблема. Мне нужно отсканировать файл css и получить все его внутренние ссылки (главным образом изображения), но мне нужно получить номер строки, где были найдены ссылки.Разбор css-файла с java

Сейчас я разбираю файлы с помощью библиотеки флейт, и он работает очень хорошо. Я также использую LineNumberReader, чтобы получить номер строки, где была найдена ссылка, но этот класс вызывает неправильный номер строки.

Например: ссылка ../../image/bg.gif находится в строке номер 350, но метод GetLineNumber в классе LineNumberReader говорит 490.

Так что я буду признателен, если некоторые из вас может управляйте мной по правильному пути и дайте мне возможное объяснение, почему класс LineNumberReader делает это.

pd: другое решение будет очень ценным.

  • Извините, возможно, опечатки, английский язык не мой родной язык.
+1

Вы должны быть более конкретными. Можете ли вы воспроизвести свою проблему, используя простой (короткий) входной файл css? Если это так, вы можете опубликовать код и ввод здесь. Тогда многие люди смогут помочь. – emrea

ответ

0

Привет @eakbas и @Favonius Спасибо за ваш ответ.
Наконец-то я получил решение, возможно, это не лучшее, но, по крайней мере, работает для меня.
Как я уже говорил, я использовал библиотеку флейт для реализации класса DocumentHandler пакета org.w3c.sac пакета для анализа файла 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 являются частью Викисклада BeanUtils апач библиотеки.

1

Другой решение - Посмотрите на эти парсеров генерации инструментов ...

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

JavaCC и Antlr обеспечивают способ получить номер строки и номер столбца.

Возможная причина для вашей проблемы ... строка номер один ... может быть из-за того, как работают инструменты генерации парсеров ... Они пытаются выяснить наилучшее совпадение ... для этого когда-то они должны отслеживать/перематывать поток .... и из-за этого ваш экземпляр LineNumberReader выходит из строя ....

Идеальный способ получить номер строки или столбца - использовать методы, предоставляемые самим инструментом ..

0

В качестве анализирующей библиотеки вы можете использовать ph-css. См. Пример «Посетите все URL-адреса, содержащиеся в CSS», по адресу https://github.com/phax/ph-css#code-examples, на примере того, как извлекать URL-адреса и определять правильную позицию источника.