###前提・実現したいこと
Java8でXPathを使ってXMLの要素を条件付きで取得したいです。
さらにその得られた要素からも相対的に取得したいため、NodeまたはElementが返される必要があります。
JDOM2というライブラリでXPathを使えるそうなので試してみましたが、エラーが発生し動作しません。
jaxenにexistsが無いと言われているようなのですが、jaxenではサポートされていないということでしょうか?
関数を消してみたら正常に動作しました。
どうしてもXPath1行でElementを取得したいので、ご存知の方どうぞご教示よろしくお願い致します。
###発生している問題・エラーメッセージ
Exception in thread "main" java.lang.IllegalStateException: Unable to evaluate expression. See cause at org.jdom2.xpath.jaxen.JaxenCompiled.evaluateRawAll(JaxenCompiled.java:200) at org.jdom2.xpath.util.AbstractXPathCompiled.evaluate(AbstractXPathCompiled.java:356) at test.JdomXpathTest.relativeAndPredicate(JdomXpathTest.java:130) at test.JdomXpathTest.main(JdomXpathTest.java:156) Caused by: org.jaxen.UnresolvableException: No Such Function exists at org.jaxen.SimpleFunctionContext.getFunction(SimpleFunctionContext.java:127) at org.jaxen.ContextSupport.getFunction(ContextSupport.java:242) at org.jaxen.Context.getFunction(Context.java:216) at org.jaxen.expr.DefaultFunctionCallExpr.evaluate(DefaultFunctionCallExpr.java:176) at org.jaxen.expr.DefaultPredicate.evaluate(DefaultPredicate.java:95) at org.jaxen.expr.PredicateSet.applyPredicate(PredicateSet.java:269) at org.jaxen.expr.PredicateSet.evaluatePredicates(PredicateSet.java:244) at org.jaxen.expr.DefaultNameStep.evaluate(DefaultNameStep.java:291) at org.jaxen.expr.DefaultLocationPath.evaluate(DefaultLocationPath.java:140) at org.jaxen.expr.DefaultAbsoluteLocationPath.evaluate(DefaultAbsoluteLocationPath.java:113) at org.jaxen.expr.DefaultXPathExpr.asList(DefaultXPathExpr.java:102) at org.jaxen.BaseXPath.selectNodesForContext(BaseXPath.java:677) at org.jaxen.BaseXPath.selectNodes(BaseXPath.java:216) at org.jdom2.xpath.jaxen.JaxenCompiled.evaluateRawAll(JaxenCompiled.java:198) ... 3 more
###該当のソースコード
java
1package test; 2 3import static org.assertj.core.api.Assertions.*; 4 5import java.io.IOException; 6import java.io.StringReader; 7import java.io.UncheckedIOException; 8import java.nio.file.Files; 9import java.nio.file.Path; 10import java.nio.file.Paths; 11import java.util.List; 12 13import org.jdom2.Document; 14import org.jdom2.Element; 15import org.jdom2.JDOMException; 16import org.jdom2.Text; 17import org.jdom2.filter.Filters; 18import org.jdom2.input.SAXBuilder; 19import org.jdom2.xpath.XPathExpression; 20import org.jdom2.xpath.XPathFactory; 21import org.junit.Test; 22 23import util.FileRead; 24 25 26public class JdomXpathTest { 27 28 protected static Document loadXml( String text ){ 29 try{ 30 SAXBuilder saxBuilder = new SAXBuilder( ); 31 return saxBuilder.build( new StringReader( text ) ); 32 }catch( JDOMException e ){ 33 throw new RuntimeException( e ); 34 }catch( IOException e ){ 35 throw new UncheckedIOException( e ); 36 } 37 } 38 39 @Test 40 public static void relativeAndPredicate( String text ){ 41 Document document = loadXml( text ); 42 XPathFactory xPathFactory = XPathFactory.instance( ); 43 Element min = document.getRootElement( ).getChild( "minutes" ); 44 XPathExpression< Element > sentenceExpression 45 = xPathFactory.compile( "//sentence[exists(.//ul/entity[@name='PERSON'])]" , Filters.element( ) ); 46 47 // java.lang.IllegalStateException: Unable to evaluate expression. See cause 48 // Caused by: org.jaxen.UnresolvableException: No Such Function exists 49 List< Element > sentences = sentenceExpression.evaluate( min ); // ここでエラー 50 System.out.println( sentences.size( ) ); 51 } 52 53 public static void main( String... strings ){ 54 Path path = Paths.get( "all-minutes\\minutes_tagged.xml" ); 55 if( !Files.exists( path ) ) 56 return; 57 String text; 58 try{ 59 text = FileReader.readAll( path ); // ファイルの内容をStringで返す 60 }catch( IOException e ){ 61 e.printStackTrace( ); 62 return; 63 } 64 relativeAndPredicate( text ); 65 } 66}
###試したこと
課題に対してアプローチしたことを記載してください
###補足情報(言語/FW/ツール等のバージョンなど)
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)
jaxen-1.1.6
jdom-2.0.6
assertj-core-3.6.1
回答2件
あなたの回答
tips
プレビュー