2013-10-28 2 views
0

이전에 JDOM1을 사용하여 xpath와 xpath를 구문 분석하고 비 제너릭 스타일에 지치기 때문에 JDOM2를 사용해 보도록하겠습니다. 모든 것이 완벽하게 작동합니다 (일반, XPathFactory , XPathExpression). 다음xpath를 JDOM2에서 작동하는 xpath로 만들 수 없습니다.

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[contains(.,'time:')]/text()", Filters.textOnly()); 
String time = timeXpath.evaluateFirst(div).getTextTrim(); 

:

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

XPath는 실패 컴파일 기능을 포함하여 그때는 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 

나는 이미 구글 스탁 k 약 2 시간 동안 추적, 아무 유용한 설립, 아마 어쩌면 내가 바보 같은 실수를 한 것 같아요, 누군가 나를 위해 그것을 알아낼 수 있습니까? 감사!

답변

0

나는 예외를 재현 할 수 없습니다 ... 나는 Jaxen 2.0.5를 Jaxen 1.1.6과 함께 사용하고 있습니다.

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 클래스 라이브러리가있을 수 있습니다 생각?

+0

rolfl, jaxen-core.jar을 제거한 후 오래된 jaxen이 jdomen 1 번들과 함께 번들로 인해 문제가 발생했습니다. 모든 것이 완벽하게 작동합니다. – fangbin