- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写将使用 Saxon xPath 的 Java 代码。我有两个问题:
有人可以帮忙吗?我知道 http://www.saxonica.com/download/download_page.xml 有一些很好的示例代码但这还不够。
看到类似的SO讨论XPath processor output as string.但是在这种情况下,我想使用 Saxon,它使用 NodeInfo。
<pre>
<!-- language: java -->
public class helloSaxon {
public static void main(String[] args) {
String xml = "";
String xPathStatement = "";
String xPathResult = "";
SaxonXPath xPathEvaluation = null;
Boolean xPathResultMatch = false;
xml="<root><a version = '1.0' encoding = 'UTF-8'>#BBB#</a><a>#CCC#</a><b><a>#DDD#</a></b></root>";
//I'm using the following XPath Tester for test scenarios
//https://www.freeformatter.com/xpath-tester.html#ad-output
// Test #1
xPathStatement="/root/a";
xPathEvaluation = new SaxonXPath(xml, xPathStatement);
xPathResult = xPathEvaluation.getxPathResult();
System.out.println("Test #1 xPathResult - " + xPathResult);
//xPathResult == "<a version = '1.0' encoding = 'UTF-8'>#BBB#</a><a>#CCC#</a>";
xPathResultMatch = xPathEvaluation.getxPathResultMatch();
System.out.println("Test #1 xPathResultMatch - " + xPathResultMatch);
//xPathResultMatch == true;
// Test #2
xPathStatement="//a";
xPathEvaluation.Reset(xml, xPathStatement);
xPathResult = xPathEvaluation.getxPathResult();
System.out.println("Test #2 xPathResult - " + xPathResult);
//xPathResult == "<a version = '1.0' encoding = 'UTF-8'>#BBB#</a><a>#CCC#</a><a>#DDD#</a>";
xPathResultMatch = xPathEvaluation.getxPathResultMatch();
System.out.println("Test #2 xPathResultMatch - " + xPathResultMatch);
//xPathResultMatch == true;
// Test #3
xPathStatement="/root/a[1]/text()";
xPathEvaluation.Reset(xml, xPathStatement);
xPathResult = xPathEvaluation.getxPathResult();
System.out.println("Test #3 xPathResult - " + xPathResult);
//xPathResult == "#BBB#";
xPathResultMatch = xPathEvaluation.getxPathResultMatch();
System.out.println("Test #3 xPathResultMatch - " + xPathResultMatch);
//xPathResultMatch == true;
// Test #4
xPathStatement="/a/root/a/text()";
xPathEvaluation.Reset(xml, xPathStatement);
xPathResult = xPathEvaluation.getxPathResult();
System.out.println("Test #4 xPathResult - " + xPathResult);
//xPathResult == "";
xPathResultMatch = xPathEvaluation.getxPathResultMatch();
System.out.println("Test #4 xPathResultMatch - " + xPathResultMatch);
//xPathResultMatch == false;
// Test #5
xPathStatement="/root";
xPathEvaluation.Reset(xml, xPathStatement);
xPathResult = xPathEvaluation.getxPathResult();
System.out.println("Test #5 xPathResult - " + xPathResult);
//xPathResult == "<root><a version = '1.0' encoding = 'UTF-8'>#BBB#</a><a>#CCC#</a><b><a>#DDD#</a></b></root>";
xPathResultMatch = xPathEvaluation.getxPathResultMatch();
System.out.println("Test #5 xPathResultMatch - " + xPathResultMatch);
//xPathResultMatch == true;
}
static class SaxonXPath{
private String xml;
private String xPathStatement;
private String xPathResult;
private Boolean xPathResultMatch;
public SaxonXPath(String xml, String xPathStatement){
this.Reset(xml, xPathStatement);
}
public void Reset(String xml, String xPathStatement){
this.xml = xml;
this.xPathStatement = xPathStatement;
this.xPathResult = "";
this.xPathResultMatch = null;
this.Evaluate();
}
public void Evaluate(){
try{
System.setProperty("javax.xml.xpath.XPathFactory:" + NamespaceConstant.OBJECT_MODEL_SAXON, "net.sf.saxon.xpath.XPathFactoryImpl");
XPathFactory xPathFactory = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON);
XPath xPath = xPathFactory.newXPath();
InputSource inputSource = new InputSource(new StringReader(this.xml));
SAXSource saxSource = new SAXSource(inputSource);
Configuration config = ((XPathFactoryImpl) xPathFactory).getConfiguration();
DocumentInfo document = config.buildDocument(saxSource);
XPathExpression xPathExpression = xPath.compile(this.xPathStatement);
List matches = (List) xPathExpression.evaluate(document, XPathConstants.NODESET);
if (matches != null && matches.size()>0) {
this.xPathResultMatch = true;
for (Iterator iter = matches.iterator(); iter.hasNext();) {
NodeInfo node = (NodeInfo) iter.next();
//need to convert content of "node" to string
xPathResult += node.getStringValue();
}
} else {
this.xPathResultMatch = false;
}
} catch(Exception e){
e.printStackTrace();
}
}
public String getxPathResult(){
return this.xPathResult;
}
public Boolean getxPathResultMatch(){
return this.xPathResultMatch;
}
}
}
</code>
将有以下输入:
我还在代码注释中添加了一些测试示例,以便您更好地理解我正在尝试做的事情。
最佳答案
首先,我建议为此使用 s9api 接口(interface)而不是 JAXP XPath 接口(interface)。原因有很多,特别是:
JAXP 接口(interface)非常适合 XPath 1.0,例如它只能识别字符串、数字、 boolean 值和节点集等数据类型。 XPath 2.0 具有更丰富的类型系统
JAXP 接口(interface)相当依赖于 DOM 作为其对象模型,尽管它对使用其他模型的可能性做出了让步(并且 Saxon 实现通过支持 NodeInfo 来利用这一点,它是 XDM 节点的实现)
JAXP 接口(interface)几乎没有类型安全;它广泛使用 Object
作为参数和结果类型,并且不使用 Java 泛型
使用标准 API 的任何可移植性优势都是虚假的,因为 (a) 除了 Saxon 之外的所有已知实现仅支持 XPath 1.0,以及 (b) 可以提供给声明为接受 Object
每个产品都不同。
每次计算 XPath 表达式时,您的代码都会创建一个新的 XPathFactory
。创建 XPathFactory
是一项非常昂贵的操作,因为它涉及搜索类路径并检查许多不同的 JAR 文件以查看哪个包含合适的 XPath 引擎。
此外,每次对 XPath 表达式求值时,您的代码都会从头开始构建源文档。同样,这非常昂贵。
话虽如此,使用 JAXP 返回字符串和 boolean 值并不是很困难。您只需将说明预期结果类型的参数 XPathConstants.NODESET 更改为 XPathConstants.STRING
或 XPathConstants.BOOLEAN
,以及 evaluate()
调用将返回一个字符串或 boolean 值来代替节点列表。但是,如果您想要返回日期或持续时间,您会被卡住,因为 JAXP 不支持它。
关于以字符串作为输出的 Java Saxon xPath 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57868984/
编辑:为什么这被否决了?我真的不知道...顺便说一句 ../不起作用,因为我不想要 Table 的父级但实际上想要 ../td+1 我不知道这是否可能? 嗨,大家好。 我手头有一个相当复杂的问题..
我很难找到需要单击的输入(复选框)元素的 xpath。我正在尝试使用其他跨度元素来定位它。元素包含 Angular 属性,不知道这是否重要? 元素的结构如下: Company name
我正在尝试构建一个包含许多 XPath 作为参数的 DSL。我是 XPath 的新手,我需要一个 XPath 语法中从未使用过的字符,这样我就可以在脚本的一行中分隔 n 个 XPath。我的问题:哪些
使用xpath在父标签内找到特定标签: 输入样例:
我需要构造一个通用XPath来找到正确的节点,其中的标准是日期和时间。例如查找“ 5 May”,“ 12:17:44”的节点 XML具有日期和时间标签。 不方便地,日期标签仅在当天的第一次出现时填充。
我正在尝试获取xPath几个月内两个日期之间的差异。 几天之内我就没问题了(1127) days-from-duration(xs:date('2012-06-17')-xs:date('2009-0
我试图选择一个包含一段文本的元素,但是我不想选择包含该文本加上其他文本的元素。我通常会使用text()='abc def',但是这个特定元素在前后都包含空格。 这是一个示例片段:
亲爱的,您能帮我用这个XPATH吗?可以说我有以下HTML代码 text value1 value2 text 我需要构建一
我正在尝试提取带有排除项的 xpath,但无法执行此操作。 (//div[@class='row site country-names']/following-sibling::div)[1]/di
response.xpath('//*[@id="blah"]//text()') 假设我的html是 This is a simple text foo and this is after tag.
除了那些具有"//ul/li[not(@*)][count(*)=0]"父项的人以外,我需要全部接受。我已经尝试过,但是不幸的是它不起作用。 有谁知道,我该怎么处理? 提前致谢。 最佳答案 我认为您需
我使用XPath的问题是,每当我使用“子字符串”功能时,我只会得到一个匹配项,而我想全部获得它们。 另一个问题是,每当我使用“子字符串”和运算符的组合时它只是行不通(没有匹配项)。 例如:http:/
我正在尝试通过其位置和属性获取项目,但不知道如何做。 我要实现的是将这一点统一起来: Xpath("//h4/a[contains(@href,'#vuln_')]") 还有这个: Xpath
我有一个xpath如下: .//*[text()='Name:']/../child::select | .//*[text()='Name:']/../child::span 但是对我来说,它既不紧
我拼命试图在xpath中组合几个过滤器。假设我的数据如下所示: DELETE 1 This is my title my sh
我想在已经通过 xpath 设置的其他元素中使用 xpath 来指示元素的位置。 下面的一个已经通过 xpath 设置(我没有改变) //Base_Code
是否可以使用xpath直接在括号内抓取信息?还是以后再用正则表达式过滤? HTML如下所示: Product name (UN1QU3 C0D3) 使用以下Xpath表达式,我可以在此中获取所有内容:
我试图使用一个XPath表达式来选择一个节点,该节点的子节点与文档中的另一个节点匹配。 匹配将意味着该节点的所有属性都相同。因此,如果将一个节点与多个属性进行比较,则无法进行单独的属性比较。 作为示例
我想在 XPath 表达式中使用 Iverson 括号(即映射 true => 1,false => 0)。 示例:而不是书写 someNumber+(if(elem1/elem2[@attr='12
是否可以以类似方式选择节点? './tr[position() in (1, 3, 7)]' 我只找到以下解决方案: './tr[position() = 1 or position() = 3 or
我是一名优秀的程序员,十分优秀!