Ищу парсер 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.
Не стесняйтесь использовать его, если вы хотите:-)
Проверьте SAC и его реализации здесь: http://www.w3.org/Style/CSS/SAC/
CSSParser немного устарел
Я только что выпустил свой собственный 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(), но не дает помощи с размерами в единицах, он видит их как список значений! Не так хорошо, как хотелось бы.