Разбор файла CSS с Java - PullRequest
       14

Разбор файла CSS с Java

1 голос
/ 05 октября 2010

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

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

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

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

pd: другое решение будет очень признателен.

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

Ответы [ 3 ]

1 голос
/ 05 октября 2010

Другое решение - Взгляните на эти инструменты генерации парсеров ...

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

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

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

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

0 голосов
/ 16 мая 2013

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

0 голосов
/ 08 октября 2010

Привет @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 являются частью библиотеки Apache commons-beanutils.

...