由于名称中存在撇号,无效的XPath表达式异常

时间:2013-11-08 12:38:39

标签: java xml xpath

我收到以下代码的无效Xpath异常。

current.Name = current.Name.replace("'", "\'");
System.out.println(current.Name );
String xp1 = "//page[@name='"+current.Name+"']" ;
Element n = (Element) oDocument.selectSingleNode(xp1+"/Body/contents");

当current.name中的字符串中包含撇号

时发生异常

current.name:"Répartitionparsecteur d'activité“

错误消息

2 个答案:

答案 0 :(得分:1)

你可以通过加倍来逃避报价:

current.Name = current.Name.replace("'", "''");

编辑:

对于Xpath 1.0,您可以尝试以下操作:

String xp1 = "//page[@name=\""+current.Name+"\"]" ;

即。使用双引号而不是单引号来分隔名称(尽管这意味着您将无法使用双引号搜索字符串。

另请注意,对于第二种解决方案,您无需替换引号。

答案 1 :(得分:1)

在XPath表达式中,字符串可以用单引号或双引号分隔。您可以在双引号字符串中包含单引号字符或在单引号字符串中包含双引号字符,但反之亦然 - 在XPath 1.0中,没有转义机制因此不可能同时包含单引号和双引号字符在同一个字符串文字中,你必须使用像

这样的技巧
concat('Strings can use "double" quotes', " or 'single' quotes")

通常,您应该避免使用字符串连接构造XPath表达式,而是使用引用变量的常量XPath表达式,并使用XPath库提供的机制传入变量值。这与使用带有参数占位符的JDBC PreparedStatement而不是连接SQL的字符串类似。您的评论建议您使用dom4j,在该库中注入变量值的机制是:

import org.jaxen.SimpleVariableContext;
import org.dom4j.XPath;

XPath xpath = oDocument.createXPath("//page[@name=$targetName]/Body/contents");
SimpleVariableContext ctx = new SimpleVariableContext();
xpath.setVariableContext(ctx);
ctx.setVariableValue("targetName", current.Name);
Element n = (Element)xpath.selectSingleNode(oDocument);

您可以使用许多不同的VariableContext对象重复使用相同的XPath。由于它没有通过XPath解析器传递current.Name值,因此该方法在所有情况下都能正常工作,即使该值包含两种类型的引号字符。