0

以前は JDOM1 を使用して xpath で xml を解析していましたが、非ジェネリック スタイルにうんざりしていたので、JDOM2 を試してみることにしました。次に、contains 関数を使用して xpath ステートメントを試します。

XPathExpression<Text> timeXpath = XPathFactory.instance().compile(
    "./p[contains(.,'time:')]/text()", Filters.textOnly());
String time = timeXpath.evaluateFirst(div).getTextTrim();

それから私は例外を得ました:

java.lang.IllegalStateException: Unable to evaluate expression. See cause
    at org.jdom2.xpath.jaxen.JaxenCompiled.evaluateRawFirst(JaxenCompiled.java:200)
    at org.jdom2.xpath.util.AbstractXPathCompiled.evaluateFirst(AbstractXPathCompiled.java:327)
    at peace.org.tm.spider.star.DamaiStarSpider.syncStarTracks(DamaiStarSpider.java:123)
    at peace.org.tm.spider.star.DamaiStarSpider.main(DamaiStarSpider.java:156)
Caused by: org.jaxen.UnresolvableException: Function :contains
    at org.jaxen.SimpleFunctionContext.getFunction(SimpleFunctionContext.java:142)
    at org.jaxen.ContextSupport.getFunction(ContextSupport.java:189)
    at org.jaxen.Context.getFunction(Context.java:153)
    at org.jaxen.expr.DefaultFunctionCallExpr.evaluate(DefaultFunctionCallExpr.java:183)
    at org.jaxen.expr.DefaultPredicate.evaluate(DefaultPredicate.java:106)
    at org.jaxen.expr.PredicateSet.evaluatePredicates(PredicateSet.java:188)
    at org.jaxen.expr.DefaultLocationPath.evaluate(DefaultLocationPath.java:218)

それから私は試しました:

XPathExpression<Text> timeXpath = XPathFactory.instance().compile(
    "./p[fn:contains(.,'time:')]/text()", Filters.textOnly());
String time = timeXpath.evaluateFirst(div).getTextTrim();

xpath コンパイルに失敗しました:

java.lang.IllegalArgumentException: Unable to compile './p[fn:contains(.,'time:')]/text()'. See Cause.
    at org.jdom2.xpath.jaxen.JaxenCompiled.<init>(JaxenCompiled.java:152)
    at org.jdom2.xpath.jaxen.JaxenXPathFactory.compile(JaxenXPathFactory.java:82)
    at org.jdom2.xpath.XPathFactory.compile(XPathFactory.java:282)
    at peace.org.tm.spider.star.DamaiStarSpider.syncStarTracks(DamaiStarSpider.java:91)
    at peace.org.tm.spider.star.DamaiStarSpider.main(DamaiStarSpider.java:156)
Caused by: org.jaxen.XPathSyntaxException: Unexpected '('
    at org.jaxen.BaseXPath.<init>(BaseXPath.java:136)
    at org.jaxen.BaseXPath.<init>(BaseXPath.java:157)
    at org.jdom2.xpath.jaxen.JaxenCompiled.<init>(JaxenCompiled.java:150)
    ... 4 more

私はすでに約 2 時間スタック トレースをグーグルで調べていますが、有用なものは何も見つかりませんでした。おそらく私は非常にばかげた間違いを犯したと思います。誰かが私のためにそれを理解できますか? ありがとう!

4

1 に答える 1

0

あなたが得ている例外を再現できません....私はJaxen 1.1.6でJDOM 2.0.5を使用しています。

私は以下を作成しました:

public static void main(String[] args) {

    Element root = new Element ("root");
    Element p = new Element("p");
    p.addContent("  Return this time: Boo! ");
    root.addContent(p);

    XPathExpression<Text> timeXpath = XPathFactory.instance().compile(
            "./p[contains(.,'time:')]/text()", Filters.textOnly());
    XPathDiagnostic<Text> xpd = timeXpath.diagnose(root, true);
    System.out.println(xpd);
    System.out.println(timeXpath.evaluateFirst(root).getTextTrim());

}

そしてそれは生成します:

[XPathDiagnostic: './p[contains(.,'time:')]/text()' evaluated (first) against org.jdom2.Element produced  raw=1 discarded=0 returned=1]
Return this time: Boo!

古い Jaxen クラス ライブラリがあると思いますか?

于 2013-10-28T14:16:15.350 に答える