5

次のコードで無効な 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épartition par secteur d'activité"

エラーメッセージ

4

2 に答える 2

1

XPath 式では、文字列を一重引用符または二重引用符で区切ることができます。二重引用符で囲まれた文字列内に一重引用符を含めることも、一重引用符で囲まれた文字列に二重引用符を含めることもできますが、その逆はできません。XPath 1.0 にはエスケープ メカニズムがないため、同じ文字列リテラル内に一重引用符と二重引用符の両方を含めることはできません。のようなトリックを使用する必要があります

concat('Strings can use "double" quotes', " or 'single' quotes")

一般に、文字列連結を使用して XPath 式を作成することは避け、代わりに変数を参照する定数 XPath 式を使用し、XPath ライブラリが提供するメカニズムを使用して変数値を渡す必要があります。PreparedStatementこれは、SQL の文字列を連結するのではなく、パラメーター プレースホルダーを使用して JDBC を使用することに似ています。あなたのコメントは、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、値に両方のタイプの引用符が含まれている場合でも、このアプローチはすべての場合に正しく機能します。

于 2013-11-08T13:20:33.250 に答える