在Java中寻找一个CSSparsing器

我在找java中的一个CSSparsing器。 特别是我的要求是,对于HTML文档中给定的节点/元素,能够从parsing器中获取/获取该元素的CSS样式。

我知道有W3C SAC接口和基于此的一个或两个实现 – 但turorials /示例显示不存在。

任何帮助/点正确的方向非常赞赏。

谢谢

我已经使用了CSSParser,而且我也喜欢,它也给错误提供了很好的反馈。

以下是我find和修改的一些示例代码:

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; } } 

用Java语言编写CSS2和CSS3文件的CSS库是https://github.com/phax/ph-css中的; ph-css它基于JavaCC语法,同时支持CSS2和CSS3,还可以让你parsingHTML样式属性。

  • 它支持最常见的黑客“*”,“_”和“$”这是不符合规范
  • 它支持CSSmath – calc()expression式
  • 它支持@page规则
  • 它支持CSS3媒体查询
  • 它支持@viewport规则
  • 它支持@keyframes规则
  • 它支持@supports规则 – 很新
  • 它支持@namespace规则
  • 您可以获取不同元素的源位置信息(行+列号,用于开始和结束 – 既用于标记也用于完整构造)

自2013年5月21日起,还有一个JDK 1.5版本,这使得Android开发更有趣

我需要一个自己的项目的CSSparsing器,但我发现“CSSParser”过于乏味和僵化(但可能只是我),所以我写了我自己的简单但function的CSSparsing器。

随意使用它,如果你想:-)

OSBCP CSSparsing器

除了cssparser.sourcefourge.net,

眼镜蛇:

http://lobobrowser.org/cobra.jsp

查看SAC及其实现: http : //www.w3.org/Style/CSS/SAC/

CSSParser有点过时了

jStyleParser提供了这个function。 它parsing所有引用的样式表并将它们映射到DOM树节点。

如果你与CSSParser争斗,因为似乎根本没有文档,你也许只想parsing一个CSSstring,比如style参数中的值,下面是我简单的使用示例:

 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似乎是不错的select。

注意:它会自动将颜色从hex格式转换为rgb()格式,但不提供单位大小的帮助,它将它们视为值列表! 不太好。

我刚刚推出了我自己的CSS Stream Parser for Java,可在github上find 。 这个parsing器的不同之处包括:

  • 这是一个streamparsing器,所以parsing器处理程序将在每个项目被parsing后立即收到所有新内容的通知
  • 全面支持所有目前logging的“规则”
  • 自定义类TokenSequenceToken简化了处理select器的过程等
  • 易于使用和理解
  • 用于validation或更高级的应用程序
  • 可扩展性:旨在能够处理对CSS定义的更改。