AngleSharp.CSS调用GetFontFamily无法返回字体族属性值问题
问题根因
GetFontFamily() 无返回值是两个写法问题共同导致的:
- 传入解析器的样式文本被HTML注释符
<!-- -->包裹,按照CSS解析规范,注释内的内容不会被解析为生效的样式规则属性。你调试时观察到的字体族名称只是注释节点内的文本,并没有被挂载到样式规则的可读取属性集合中。 - 调用
SetFontFamily()传入多单词字体名Verdana Bold时没有按CSS规范加引号,解析器会将未加引号的多词字体值判定为非法值直接丢弃,不会写入属性存储,后续读取自然拿不到结果。
修复方案
按以下三点调整即可:
- 预处理待解析的样式文本,剔除外层的HTML注释标签。纯CSS解析场景不需要兼容HTML注释语法,如果需要兼容旧页面style标签内裹HTML注释的写法,解析前用字符串替换删掉
<!--和-->即可。 - 传入多单词字体名时,给字体名补充成对的单引号或双引号,符合CSS语法要求,例如传值写为
"'Verdana Bold'"。 - 如果需要跳过封装方法的合法性校验直接读取原始属性值,可以直接调用通用属性读取方法
rule.Style.GetPropertyValue("font-family"),这种方式能直接拿到解析到的原始字符串值,兼容性更强。
修正后的可运行测试代码如下:
public void CssStyleSheetExtractFontFamily() { var parser = new CssParser(); // 移除外层HTML注释,传入合法纯CSS文本 var source = "body { font-family: Verdana } div.hidden { display: none }"; ICssStyleSheet sheet = parser.ParseStyleSheet(source); Debug.Print(sheet.Rules.Length.ToString()); foreach (ICssStyleRule rule in sheet.Rules) { Debug.Print(rule.CssText); // 多词字体名按规范加引号 rule.Style.SetFontFamily("'Verdana Bold'"); // 封装方法读取 Debug.Print("fontfamily", rule.Style.GetFontFamily()); // 原始属性值读取,不受封装校验逻辑影响 Debug.Print("fontfamily_raw", rule.Style.GetPropertyValue("font-family")); Debug.Print("fontSize", rule.Style.GetFontSize()); } }
内容的提问来源于stack exchange,提问作者Ghisbo
相关产品推荐
相关产品推荐

