6

標準の JAX-P xpath 式エンジンまたは別の準拠エンジンを使用して、パラメーター化を可能にする xpath 式をコンパイルすることは可能ですか?

開発者がコンパイル済みの xpath 内にプレースホルダーを設定し、実行時にそれらの値を置き換えることができる API があるかどうかを調べています。

これが可能かどうか、および警告、落とし穴、または単に「それをしないでください」タイプのアドバイスがあるかどうかについての洞察をいただければ幸いです。

(「ストリームの交差」を修正したことに注意してください... xpathと正規表現に関して同僚と会話していました...たまたま精神的に舌を縛られました...混乱して申し訳ありません)

4

3 に答える 3

11

これは非常に単純な実装ですjavax.xml.xpath.XPathVariableResolver

import java.util.HashMap;
import java.util.Map;
import javax.xml.namespace.QName;
import javax.xml.xpath.XPathVariableResolver;

public class SimpleVariableResolver implements XPathVariableResolver {

    private static final Map<QName, Object> vars = 
        new HashMap<QName, Object>();

    public void addVariable(QName name, Object value) {
        vars.put(name, value);
    }

    public Object resolveVariable(QName name) {
        return vars.get(name);
    }

}

次のように使用します。

public static void main(String[] args) throws ParserConfigurationException,
        SAXException, IOException, XPathExpressionException {

    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    Document doc = builder.parse("workbook.xml");

    XPath xpath = XPathFactory.newInstance().newXPath();
    SimpleVariableResolver resolver = new SimpleVariableResolver();
    resolver.addVariable(new QName(null, "id"), 2);
    xpath.setXPathVariableResolver(resolver);
    XPathExpression expr = xpath.compile("/root/element[@id=$id]");
    Object result = expr.evaluate(doc, XPathConstants.NODESET);

    NodeList nodes = (NodeList) result;
    for (int i = 0; i < nodes.getLength(); i++) {
        System.out.println(nodes.item(i).getTextContent());
    }
}

このドキュメントについて:

<root>
    <element id="1">one</element>
    <element id="2">two</element>
    <element id="3">three</element>
</root>

出力:

two
于 2011-07-19T17:59:51.953 に答える
5

「正規表現」があなたの質問のどこに当てはまるのかよくわかりません。

JAXP API では、XPath 式に変数 (例: //emp[ssn=$e]) を含めることができます。変数の値は、API の一部として指定した VariableResolver を呼び出すことにより、実行時に取得されます。JAXP 仕様は、受け入れ可能な値の種類についてかなり緩く、これは実装ごとに異なる場合があります。

Saxon XPath API (s9api) はこれをさらに進め、式のコンパイル時に変数とその型を明示的に宣言し、式の実行時に変数 (任意の XPath 2.0 型) に値を提供できるようにします。

于 2011-07-19T16:47:50.840 に答える
1

私の知る限り、いいえ。私はしばらく前にそれを研究し、結局使用しString.format()ました。

しかし、この方法では、パラメータ化された xpath expr として一度コンパイルすることはできません。

于 2011-07-19T16:19:08.553 に答える