Java css解析器不';不行?

Java css解析器不';不行?,java,css,Java,Css,我编写了一个程序,使用jar cssparser-0.9.5.jar扫描css文件,并对其执行了一些操作 public static Map<String, CSSStyleRule> parseCSS(String FileName) throws IOException { Map<String, CSSStyleRule> rules = new LinkedHashMap<String, CSSStyleRule>();

我编写了一个程序,使用jar cssparser-0.9.5.jar扫描css文件,并对其执行了一些操作

public static Map<String, CSSStyleRule> parseCSS(String FileName) throws IOException {
        Map<String, CSSStyleRule> rules = new LinkedHashMap<String, CSSStyleRule>();
        InputSource inputSource = new InputSource(
                new FileReader(FileName));
        CSSStyleSheet styleSheet = new CSSOMParser().parseStyleSheet(
                inputSource, null, null);

        CSSRuleList ruleList = styleSheet.getCssRules();
        for (int i = 0; i < ruleList.getLength(); i++) {
            CSSRule rule = ruleList.item(i);
            if (rule.getType() == CSSRule.STYLE_RULE) {
                CSSStyleRule styleRule = (CSSStyleRule) rule;
                rules.put(styleRule.getSelectorText(), styleRule);
            }
        }

        return rules;
    }
解析后,对于类.overlay的属性中存在的双“:”给出错误


那么有没有办法解决这个问题呢?

您发布的代码比实际问题所在的位置高出了几个级别。问题出在词法扫描程序中。它对标识符(IDENT)的定义似乎是错误的,因为它还可以包含连字符并以连字符开头

正如CSS3语法规范所述:

在CSS3中,标识符(包括选择器中的元素名称、类和ID(请参见[SELECT[或这仍然是真的])只能包含字符[A-Za-z0-9]和ISO 10646 161及更高的字符,加上连字符(-)和下划线();它们不能以数字或连字符后跟数字开头


请参阅完整规范。

您发布的代码比实际问题所在的位置高出了几个级别。问题出在词法扫描程序中。它对标识符(IDENT)的定义似乎有误,因为它还可能包含连字符并以连字符开头

正如CSS3语法规范所述:

在CSS3中,标识符(包括选择器中的元素名称、类和ID(请参见[SELECT[或这仍然是真的])只能包含字符[A-Za-z0-9]和ISO 10646 161及更高的字符,加上连字符(-)和下划线();它们不能以数字或连字符后跟数字开头


请参阅完整的规范。

可能重复使用so任何方法来处理此问题?可能重复使用so任何方法来处理此问题?好的,谢谢您的帮助,但如何处理此问题?我需要更改整个代码吗?更改此代码不应影响您的大部分代码。必须在lexer中进行调整,其中scans输入并将其分解为语法分析器的标记。CSS属性(即
背景色
)将被lexer识别为标识符。您必须调整lexer中的一些代码,以确保标识符也可以以连字符(-)开头。事实上,我使用的是cssparser0.9.5 JAR。它可能对2.1以上版本的CSS使用解析器,因为对于这些版本,CSS属性不能以连字符开头。创建解析器时,可以指定它应该使用的底层解析器。请尝试以下操作:
new CSSOMParser(new com.steadystate.CSS.parser.sacparsercs21())
然后看看它是否工作,否则使用最新版本的CSS解析器,即0.9.7。嘿,它解决了我99%的问题,现在只解决了过滤器的一个问题:progid:DXImageTransform.Microsoft.Shadow(强度=4,方向=135,颜色='#000000');好的,谢谢您的帮助,但是如何处理这一问题我需要更改整个代码吗?更改这一点不会影响您的很多代码。必须在lexer中进行调整,它扫描输入并将其分解为parser.CSS属性的标记(即
背景色
)将被lexer识别为标识符。您必须调整lexer中的一些代码,以确保标识符也可以以连字符(-)开头。事实上,我使用的是cssparser0.9.5 JAR。它可能对2.1以上版本的CSS使用解析器,因为对于这些版本,CSS属性不能以连字符开头。创建解析器时,可以指定它应该使用的底层解析器。请尝试以下操作:
new CSSOMParser(new com.steadystate.CSS.parser.sacparsercs21())
然后看看它是否工作,否则使用最新版本的CSS解析器,即0.9.7。嘿,它解决了我99%的问题,现在只解决了过滤器的一个问题:progid:DXImageTransform.Microsoft.Shadow(强度=4,方向=135,颜色='#000000');
.overlay
{

    filter: progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=135, Color='#000000');

}