使用Java解析HTML中的“style”属性

10

我有解析成org.w3c.dom.Document的HTML代码。我需要检查所有style属性的标签,解析它们,更改一些CSS属性,并将修改后的样式定义放回属性中。

是否有标准的方法来解析style属性?我该如何使用org.w3c.dom.css包中的类和接口?

我需要一个Java解决方案。


2
不建议使用正则表达式。这是9成新手首先要求的,但我们都知道这是不可能的。 - Paul Tomblin
3个回答

3
如果您希望在不依赖任何其他工具的情况下实现此功能,您可以使用javax.swing.text.html包中的类来完成大部分工作:
import javax.swing.text.html.*;

StyleSheet styleSheet = new StyleSheet()
AttributeSet dec = ss.getDeclaration("margin:2px;padding:3px");
Object marginLeft = dec.getAttribute(CSS.Attribute.MARGIN_LEFT);
String marginLeftString = marginLeft.toString(); // "2px"

这将返回一个 StyleSheet.CssValue,不幸的是它并不是公开的。因此需要将其转换为字符串。另外,它不会处理 em 单位。虽然在各种样式方面有点聪明,但不是理想的解决方案,但避免了依赖关系。


谢谢您的解决方案,但我想看到更通用的东西,支持非标准CSS属性(例如moz_xxx)。换句话说,我需要一个通用的解析器,只解析样式而不实现它。 - Andrey

1
首先,我会查看javax.xml包中的类。 javax.xml.parsers包含两种解析方式的解析器:SAXParser和DocumentBuilder。听起来你想要使用DocumentBuilder创建DOM。你可以手动遍历DOM(缓慢而痛苦),或者你可以使用XPath标准在DOM中查找元素。Java对此的支持在javax.xml.xpath中。
XPathExpression xpath = XPath.compile("//@style");
Object results = xpath.evaluate(dom, XPathConstants.NODESET);

将结果转换为NodeList并正确迭代是您的责任,但这是最直接的方法来获取您想要的内容。请查看Java的DOM API以获取有关读取和更改值的更多信息。

我不认为Java内置了CSS解析器的支持,但您可以查看这些项目:

这可能有助于您实现目标。注意:Batik CSS解析器已纳入更大的Apache Batik项目中:http://xmlgraphics.apache.org/batik/index.html,其中可能包含您所需的内容,而且它具有企业友好的许可证。


HTML已经被解析,我也知道如何收集样式属性。现在我需要解析这些样式属性的内容。即将带有CSS定义的字符串转换为键值对集合或类似的东西。 - Andrey
你看了我指给你的CSS解析器项目了吗?没有javax.*包用于解析CSS。穷人的方法是使用正则表达式,这对于CSS来说可以工作得很好 - 但这不是你想要的。 - Berin Loritsch
感谢提供的库链接。css.sac旨在解析CSS样式表。cssparser没有任何文档,甚至没有简单的使用说明。batik对于我的任务来说似乎过于复杂。 - Andrey

0

我不确定我完全理解你的要求,但基本上,你需要:

  1. 读取样式表并提取CSS规则。
  2. 读取HTML页面并查找属性。
  3. 用新的CSS属性替换旧的CSS属性。
  4. 编写HTML页面。

看起来你会使用CSSStyleSheet接口从样式表中提取CSS规则。


不,我有一个包含样式属性值的字符串,我需要按照CSS标准将其解析为键值对。 - Andrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接