Ищу парсер CSS в Java

Я ищу парсер CSS в Java. В частности, мое требование заключается в том, чтобы данный узел / элемент в HTML-документе мог запрашивать / получать стили CSS для этого элемента из анализатора.

Я знаю, что есть интерфейс W3C SAC и одна или две реализации, основанные на этом - но турориалы / примеры кажутся несуществующими.

Любая помощь / очки в правильном направлении высоко ценится.

Спасибо

8 ответов

Я использовал CSSParser, и он мне нравится - он также дает хорошие отзывы об ошибках.

Вот пример кода, который я нашел и изменил:

package com.dlogic;

import com.steadystate.css.parser.CSSOMParser;
import org.w3c.css.sac.InputSource;
import org.w3c.dom.css.CSSStyleSheet;
import org.w3c.dom.css.CSSRuleList;
import org.w3c.dom.css.CSSRule;
import org.w3c.dom.css.CSSStyleRule;
import org.w3c.dom.css.CSSStyleDeclaration;
import java.io.*;


public class CSSParserTest 
{

    protected static CSSParserTest oParser;

    public static void main(String[] args) {

            oParser = new CSSParserTest();

            if (oParser.Parse("design.css")) {

                System.out.println("Parsing completed OK");

            } else {

                System.out.println("Unable to parse CSS");

            }   
    }


     public boolean Parse(String cssfile) 
     {

         FileOutputStream out = null; 
         PrintStream ps = null; 
         boolean rtn = false;

         try
         {

                // cssfile accessed as a resource, so must be in the pkg (in src dir).
                InputStream stream = oParser.getClass().getResourceAsStream(cssfile);

                 // overwrites and existing file contents
                 out = new FileOutputStream("log.txt");

                 if (out != null)
                 {
                     //log file
                     ps = new PrintStream( out );
                     System.setErr(ps); //redirects stderr to the log file as well

                 } else {

                     return rtn; 

                }


                InputSource source = new InputSource(new InputStreamReader(stream));
                CSSOMParser parser = new CSSOMParser();
                // parse and create a stylesheet composition
                CSSStyleSheet stylesheet = parser.parseStyleSheet(source, null, null);

                //ANY ERRORS IN THE DOM WILL BE SENT TO STDERR HERE!!
                // now iterate through the dom and inspect.

                CSSRuleList ruleList = stylesheet.getCssRules();

                ps.println("Number of rules: " + ruleList.getLength());


               for (int i = 0; i < ruleList.getLength(); i++) 
               {
                 CSSRule rule = ruleList.item(i);
                 if (rule instanceof CSSStyleRule) 
                 {
                     CSSStyleRule styleRule=(CSSStyleRule)rule;
                     ps.println("selector:" + i + ": " + styleRule.getSelectorText());
                     CSSStyleDeclaration styleDeclaration = styleRule.getStyle();


                     for (int j = 0; j < styleDeclaration.getLength(); j++) 
                     {
                          String property = styleDeclaration.item(j);
                          ps.println("property: " + property);
                          ps.println("value: " + styleDeclaration.getPropertyCSSValue(property).getCssText());
                          ps.println("priority: " + styleDeclaration.getPropertyPriority(property));   
                     }



                  }// end of StyleRule instance test
                } // end of ruleList loop

               if (out != null) out.close();
               if (stream != null) stream.close();
               rtn = true;
            }
            catch (IOException ioe)
            {
                System.err.println ("IO Error: " + ioe);
            }
            catch (Exception e)
            {
                System.err.println ("Error: " + e);

            }
            finally
            {
                if (ps != null) ps.close(); 
            }

            return rtn;

    }

}

Библиотека CSS для чтения и записи файлов CSS2 и CSS3 на Java - ph-css с https://github.com/phax/ph-css Она основана на грамматике JavaCC и поддерживает как CSS2, так и CSS3, а также позволяет вам разбирать атрибуты стиля HTML.

  • Он поддерживает наиболее распространенные хаки "*", "_" и "$", которые не соответствуют спецификации
  • Поддерживает CSS математику - выражение calc()
  • Поддерживает правило @page
  • Поддерживает медиазапросы CSS3
  • Поддерживает правила @viewport
  • Поддерживает правила @keyframes
  • Он поддерживает правила @supports - довольно новый
  • Поддерживает правила @namespace
  • Вы можете получить информацию о местоположении источника для различных элементов (строка + номер столбца для начала и конца - как для тега, так и для полной конструкции)

С 21 мая 2013 года также доступна версия JDK 1.5, что делает ее более интересной для разработки под Android

Мне нужен был синтаксический анализатор CSS для собственного проекта, но я обнаружил, что "CSSParser" слишком утомителен и негибок для работы (но это мог быть только я), поэтому я в итоге написал свой собственный простой, но функциональный парсер CSS.

Не стесняйтесь использовать его, если вы хотите:-)

CSS-парсер OSBCP

Проверьте SAC и его реализации здесь: http://www.w3.org/Style/CSS/SAC/

CSSParser немного устарел

Дополнение к cssparser.sourcefourge.net,

Cobra:

http://lobobrowser.org/cobra.jsp

Я только что выпустил свой собственный CSS Stream Parser для Java, доступный на github. Что выделяет этот парсер, включает в себя:

  • Это потоковый синтаксический анализатор, поэтому обработчик синтаксического анализатора будет получать уведомления обо всем новом контенте сразу после анализа каждого элемента.
  • Полная поддержка всех в настоящее время документированных At-Rules
  • Индивидуальные занятия TokenSequence а также Token упростить процессы обработки селекторов и т. д.
  • Легко использовать и понять
  • Полезно для проверки или для более сложных приложений
  • Масштабируемость: предназначена для обработки изменений в определениях CSS.

jStyleParser обеспечивает именно эту функциональность. Он анализирует все ссылочные таблицы стилей и сопоставляет их с узлами дерева DOM.

Если вы боретесь с CSSParser, потому что кажется, что документации вообще нет, и вы, возможно, хотите проанализировать только строку CSS, например значение из параметра стиля, вот мой простой пример использования:

import org.junit.Test;
import org.w3c.css.sac.InputSource;
import org.w3c.dom.css.CSSRule;
import org.w3c.dom.css.CSSStyleDeclaration;
import org.w3c.dom.css.CSSValue;

import com.steadystate.css.parser.CSSOMParser;

public class ParseCssTest {

@Test
public void testParseStyleDeclaration() throws IOException {
    String cssSample = "margin-top: 0cm; margin-bottom: 0cm; background: #e6e6e6";
    CSSOMParser parser = new CSSOMParser();
    CSSStyleDeclaration o = parser.parseStyleDeclaration(new InputSource(new StringReader(cssSample)));
    assertEquals("margin-top: 0cm; margin-bottom: 0cm; background: rgb(230, 230, 230)", o.toString());
    assertEquals("0cm", o.getPropertyCSSValue("margin-bottom").toString());
    assertEquals("0cm", o.getPropertyCSSValue("margin-bottom").getCssText());
    assertEquals(null, o.getPropertyCSSValue("foo"));
}

@Test
public void testParseARule() throws IOException {
    String cssSample = "r1 { margin-top: 0cm; margin-bottom: 0cm; background: #e6e6e6 }";
    CSSOMParser parser = new CSSOMParser();
    CSSRule o = parser.parseRule(new InputSource(new StringReader(cssSample)));
    assertEquals("r1 { margin-top: 0cm; margin-bottom: 0cm; background: rgb(230, 230, 230) }", o.toString());
}

@Test
public void parseStyleDeclarationWithAdvancedTests() throws IOException {
    String cssSample = "margin-top: 0 cm; margin-bottom: 0cm; background: #e6e6e6";
    CSSOMParser parser = new CSSOMParser();
    CSSStyleDeclaration o = parser.parseStyleDeclaration(new InputSource(new StringReader(cssSample)));
    assertEquals("margin-top: 0 cm; margin-bottom: 0cm; background: rgb(230, 230, 230)", o.toString());

    assertEquals("0cm", o.getPropertyCSSValue("margin-bottom").toString());
    assertEquals("0cm", o.getPropertyCSSValue("margin-bottom").getCssText());
    assertEquals(CSSValue.CSS_VALUE_LIST, o.getPropertyCSSValue("margin-top").getCssValueType());

    assertEquals("0 cm", o.getPropertyCSSValue("margin-top").toString());
    assertEquals("0 cm", o.getPropertyCSSValue("margin-top").getCssText());
    assertEquals(CSSValue.CSS_VALUE_LIST, o.getPropertyCSSValue("margin-top").getCssValueType());
}
}

Большим преимуществом CSSParser является то, что он в настоящее время находится в Maven. Так что если вы ищете что-то довольно простое и понятное в использовании, CSSParser кажется хорошим вариантом.

Примечания: он выполняет автоматическое преобразование цветов из шестнадцатеричного формата в формат rgb(), но не дает помощи с размерами в единицах, он видит их как список значений! Не так хорошо, как хотелось бы.

Другие вопросы по тегам