java如何确定XPath是针对(返回)属性还是元素?
在Java中,如何正确地确定XPath选择器是以属性还是元素为目标
为了解释这个问题:我需要从WebDriver的WebElement获取文本。元素的innerText或其属性取决于XPath。不幸的是,每个提取都是不同的(见下文),因此我必须首先确定预期目标是什么,元素或属性:
String getStringValue(String selector, WebElement context) {
if(targetsAttribute(selector) {
WebElement node = context.findElement(new By.xpath(elemPart(selector)));
return node.getAttribute(attrName(selector));
} else {
return context.findElement(new By.xpath(selector)).getText();
}
};
我正在寻找targetsAttribute
、elemPart
和attrName
方法的实现。目前我使用正则表达式:
Pattern ATTR_PAT = Pattern.compile("^.*/@([^/]+)$");
Pattern ELEM_PAT = Pattern.compile("^(.*)/@[^/]+$");
但我发现这种方法既丑陋又不系统。例如,它与attribute::
不匹配。是否有一些方法可以使用一些标准库来实现这一点
注意:我实际上是在试图解决与下面问题类似的问题,只是稍微高一点:
# 1 楼答案
缺乏节点无关的方法来处理文本内容在许多方面(如果不是全部的话)都是一个问题XPathAPI。而且,如前所述,没有完全通用的方法预先确定XPath表达式是否选择属性或元素,因为它可以使用析取组合选择两者
如果您可以排除析取(或单独处理每个片段),那么启发式地,这完全取决于表达式中最后一个斜杠后面的内容:如果余数以“@”(或“attribute::”)开头,则您选择的是一个属性;否则,将创建一个元素。这不是防弹的,但根据经验,我发现这在实践中已经足够好了。你的启发式方法和其他方法一样好
# 2 楼答案
您可能可以使用XPath expression parser,它是Saxon XSLT/XQuery处理器的一部分
ExpressionParser的parseExpression()方法应该能够为您提供所需的信息
如果你真的弄明白了,请发布你的代码(作为答案),因为我不知道还有其他人发布了解决方案
编辑:
实际上,对于每个XPath表达式,不可能构造一个能够正确回答它是选择元素还是选择属性的算法。这是因为XPath表达式返回的结果类型可能取决于输入。例如,XPath表达式
根据文档中存在的元素和属性,可以同时返回元素和属性,也可以不返回
但是,使用上面提到的解析工具可能会让您有最好的机会了解XPath表达式的子集是否可以返回属性
在我看来,无法获取XPath表达式的字符串值(无论它选择的是元素还是属性)是WebDriverAPI中的一个严重缺陷。除非它以我不知道的其他方式提供了这种能力