javax.xml.xpath的XPath表达式无法正常工作

时间:2016-09-28 16:41:58

标签: java html xpath javax.xml

我想从这个网站中提取内容:https://it.projektwerk.com/de/projects/

e.g。我有一个XPath表达式:.//*[@id='content_0']/H3/A (请注意,大写字母是正确的,因为我的文档解析器 - > org.cyberneko.html ...将标记解析为那些大写字母)

这是一个有效的XPath表达式;我可以使用FirePath获取内容。但是,使用javax.xml.xpath类,无法进行检索。我是这样做的:

XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile(exprString);
Node node = expr.evaluate(doc, XPathConstants.NODE);

node始终为null

我不明白这一点,因为还有其他网站的其他表达方式具有相同的语法,其中有效(例如.//*[@id='p_p_id']/DIV/DIV/DIV/DIV[3]/A/H3/SPAN

希望有人可以提供帮助。

1 个答案:

答案 0 :(得分:0)

感谢VGR,我能够了解这个问题。那些Xpath表达式不起作用的网站是一个名称空间感知的网站,其中的html标签构造如下:     

当我使用HtmlCleaner时,我使用了以下代码:

HtmlCleaner cleaner = new HtmlCleaner();
CleanerProperties props = cleaner.getProperties();
props.setNamespacesAware(false);
TagNode mainNode = cleaner.clean(htmlString);

根据文档,它应该从html文档中剥离命名空间属性。但这确实工作!令人惊讶的是,测试的html文档的html标记内的xmlns属性只会更改其在属性列表中的位置。 因此,解决方案是使用html节点的HtmlCleaner的TagNode表示从htmlTag手动删除xmlns属性:

public TagNode removeNamespaceFromHtmlTag(TagNode htmlNode) {
    htmlNode.removeAttribute("xmlns");
    return htmlNode;
}

删除它,问题中定义的XPath表达式将返回所需的结果。