在java中寻找CSS解析器[已关闭]

2022-09-01 07:35:01

我正在寻找java中的CSS解析器。特别是我的要求是,对于HTML文档中的给定节点/元素,能够从解析器中询问/获取该元素的css样式。

我知道有W3C SAC接口和一个或2个基于此的实现 - 但turorials/示例似乎不存在。

任何帮助/指向正确的方向,非常感谢。

谢谢


答案 1

我使用过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;

    }

}

答案 2

用于在Java中读取和写入CSS2和CSS3文件的CSS库是 https://github.com/phax/ph-css ph-css,它基于JavaCC语法,支持CSS2和CSS3,并允许您解析HTML样式属性。

  • 它支持最常见的黑客“*”,“_”和“$”,这些黑客不符合规范
  • 它支持CSS数学 - calc()表达式
  • 它支持@page规则
  • 它支持 CSS3 媒体查询
  • 它支持@viewport规则
  • 它支持@keyframes规则
  • 它支持@supports规则 - 相当新
  • 它支持@namespace规则
  • 您可以获取不同元素的源位置信息(开始和结束的行 + 列号 - 包括标记和完整构造)

自2013年5月21日起,JDK 1.5版本也可用,这使得Android开发更加有趣。


推荐