Java VTD-XML和Xpath 2.0转义字符串
当我尝试使用VTD-XML在Java中运行以下xpath表达式时,我遇到了一个意外错误 代码:Java VTD-XML和Xpath 2.0转义字符串,java,xml,xpath,vtd-xml,Java,Xml,Xpath,Vtd Xml,当我尝试使用VTD-XML在Java中运行以下xpath表达式时,我遇到了一个意外错误 代码: .. AutoPilot ap = new AutoPilot(vn); ap.selectXPath("/a//b[text() = 'apple''banana']"); Syntax error after or around the end of ==> /a//b[text() = 'apple' Caused by: com.ximpleware.XPathParseExcepti
..
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("/a//b[text() = 'apple''banana']");
Syntax error after or around the end of ==> /a//b[text() = 'apple'
Caused by: com.ximpleware.XPathParseException: XPath Syntax error: #29
at com.ximpleware.xpath.parser.unrecovered_syntax_error(parser.java:492)
at java_cup.runtime.lr_parser.parse(lr_parser.java:601)
at com.ximpleware.AutoPilot.selectXPath(AutoPilot.java:809)
错误:
..
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("/a//b[text() = 'apple''banana']");
Syntax error after or around the end of ==> /a//b[text() = 'apple'
Caused by: com.ximpleware.XPathParseException: XPath Syntax error: #29
at com.ximpleware.xpath.parser.unrecovered_syntax_error(parser.java:492)
at java_cup.runtime.lr_parser.parse(lr_parser.java:601)
at com.ximpleware.AutoPilot.selectXPath(AutoPilot.java:809)
这不是虫子吗?我的印象是,在XPath2.0中转义单引号是可以接受的?当我尝试使用同一文档在XMLSpy中运行xpath查询时,它运行得很好。转义完全由使用xpath查询数据的宿主语言负责。该高级语言的转义规则通常也适用于其中使用的XPath表达式 我引用Michael Kay的XPath 2.0程序员参考: 类似地,当XPath表达式写在字符串中时 在Java等宿主语言中,需要使用转义 该语言的惯例:例如,[…]引号
\”
换句话说,'
确实转义了一个单引号。在Java中,单引号必须转义为\'
ap.selectXPath("/a//b[text() = 'apple\'banana']");
不幸的是,转义似乎不是一个选项,我不得不基于以下内容编写一个自定义函数: 它是用javascript编写的,所以我将其转换为Java:
private static String cleanStringForXPath(String dirtyString)
{
Pattern pattern = Pattern.compile("([^'\"]+|['\"])");
Matcher matcher = pattern.matcher(dirtyString);
int count = 0;
StringBuilder sb = new StringBuilder();
while(matcher.find()) {
String part = matcher.group(1);
if(part.equals("'")) {
sb.append("\"'\"");
} else if(part.equals("\"")) {
sb.append("'\"'");
} else {
sb.append("'" + part + "'");
}
sb.append(",");
count++;
}
String result = sb.length() > 0 ? sb.substring(0, sb.length() - 1): "";
return (count > 1) ? "concat(" + result + ")" : result;
}
我测试了这个函数,它似乎解决了我的问题。因为XPath也可以支持
。“
字符串可以包含unscaped'-s,您可以使用:
ap.selectXPath("/a//b[text() = \"apple'banana\"]");
谢谢,我尝试了这个,但没有成功。我现在得到了acom.ximpleware.XPathParseException:XPath表达式异常中的无效字符。@BigbyWolf是唯一标识元素的单引号吗?如果显示要查询的XML文件,也许我们可以找到另一个返回同一节点的表达式。@BigbyWolf,您确定吗VTD-XML使用XPath 2.0?在sourceforge页面上,我发现:“VTD-XML完全符合W3C XPath 1.0建议。”。这是否过时了?感谢您的帮助。我相信您是正确的,VTD-XML使用的是XPath 1.0(我的错误)。基于此,我尝试了“和&apos”,我相信它应该在XPath 1.0中工作,但运气不好。最后,我编写了一个自定义方法,将字符串拆分并使用Xpath concat函数。我通常建议将参数注入Xpath表达式中,使用Xpath库提供的工具设置变量,然后引用表达式中的变量(
/a//b[.=$targetValue]
)。但是VTD-XML只允许您通过计算另一个XPath表达式来设置变量,这与我所知道的所有其他XPath实现不同,它允许您直接插入Java字符串或数字作为变量的值。我认为双引号前面的反斜杠应该可以解决问题。如果您像这样转义双引号,那么它们很可能被认为是字符串的一部分,并且不划界任何东西。@MathiasMüller:Ofc它们被认为是字符串的一部分。这就是问题所在,字符串成为XPath表达式,但是,这个字符串不再被分隔,这将导致一个错误(或者XPath将决定它是一个元素名)。至少在我看来是这样。如果我遗漏了一些明显的内容,我深表歉意。XPath只会看到最后一个未替换的字符串。Aka/a//b[text()=“苹果香蕉”]