Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

JavaのXPathとは?

XPathとは、XML文書の特定の部分をパスで指定する方法です。

パスを利用して、必要な情報がどこにあるのかを表すため、 パスを入力とした抽出処理を考えられるようになります。

XPath自身はXML文書というわけではなく、XML文書の一部分として働きます。

XPathのデータモデルの場合、XMLデータを下記の7種類のノードで構成したツリーと考えます。

※1 処理命令とは、「 <?」 と 「?>」 で挟まれた一文を指します。XML宣言は処理命令の形をしていますが、XML 1.0 の構文上、処理命令ではないことからXML宣言は処理命令ノードとしては扱いません。

基本的には、UNIX系の階層型ファイル・システムのパスと同様に指定可能です。

加えて、関数や式を組み合わせて複雑な指定もできるようになっています。

evaluateメソッドとは?

evaluateメソッドは、コンテキストでXPath式を評価して、結果をStringとして返すXPathのメソッドです。

使い方には4種類あり、それぞれ下記の通りとなっています。

修飾子と型 メソッドと説明
String evaluate(String expression, InputSource source)
指定されたInputSourceのコンテキストでXPath式を評価し、結果をStringとして返します。
Object evaluate(String expression, InputSource source, QName returnType)
指定されたInputSourceのコンテキストでXPath式を評価し、結果を指定された型として返します。
String evaluate(String expression, Object item)
指定されたコンテキストでXPath式を評価し、結果をStringとして返します。
Object evaluate(String expression, Object item, QName returnType)
指定されたコンテキストでXPath式を評価し、結果を指定された型として返します。

また、XPath式の評価は下記の通りです。

XPath式の評価
コンテキスト コンテキスト項目がない式を評価する要求が行われた場合、コンテキストには空の
ドキュメント・ノードが使用される。XPath式を評価するため、DocumentFragmentが
ドキュメント・ノードと同様に扱われる。
変数 式に変数の参照が含まれる場合、setXPathVariableResolver(XPathVariable
Resolver resolver)で設定されたXPathVariableResolverによってその値が見つけられる。
変数リゾルバが定義されていないか、リゾルバから変数に対してnullが返された場合、XPathExpressionExceptionが生成される。
変数の値は、1回の評価の過程を通じて不変でなければならない。
関数 式に関数の参照が含まれる場合、setXPathFunctionResolver(XPathFunction
Resolver resolver)で設定されたXPathFunctionResolverによって関数が見つけられる。
関数リゾルバが定義されていないか、関数リゾルバから関数に対してnullが返された場合、
XPathExpressionExceptionが生成される。
QName 式の中のQNameはsetNamespaceContext(Name
spaceContext nsContext)で
設定されたXPath名前空間コンテキストと照らして解決される。
結果 式の評価の結果は目的の戻り値の型のインスタンスに変換される。
有効な戻り値の型は、XPathConstantsに定義する。戻り値の型への変換はXPath変換規則に従う。

参照:XPath (Java Platform SE 8 )

XPathの使い方(ロケーションパス)

XPathでXML文書のノードを指定するものを「ロケーションパス」と言います。

ロケーションパスは、スラッシュで区切ることでノード階層を表すものです。

ロケーションパスは、ルートノードから指定する”絶対ロケーションパス”と、任意のノードを起点とする”相対ロケーションパス”の2つがあります。

そして、起点とするノードのことをコンテキスト(文脈)ノードと言い、絶対ロケーションパスは、コンテキストノードがルートノードであるロケーション・パスです。

例えば、次のXML文書を参考にロケーションパスを記述してみます。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <member>
  3. <user id="P210401" sex="male">
  4. <name>田中 太郎</name>
  5. <contact kind="email">tanaka@potepan.com</contact>
  6. <contact kind="url">https://style.potepan.com/tanaka</contact>
  7. <image file="tanaka01.png" />
  8. </user>
  9. <user id="P210401" sex="female">
  10. <name>佐藤 花</name>
  11. <contact kind="email">satou@potepan.com</contact>
  12. <contact kind="url">https://style.potepan.com/satou</contact>
  13. <image file="satou03.png" />
  14. </user>
  15. <user id="P210401" sex="male">
  16. <name>鈴木 裕斗</name>
  17. <contact kind="email">suzuki@potepan.com</contact>
  18. <contact kind="url">https://style.potepan.com/suzuki</contact>
  19. <image file="suzuki05.png" />
  20. </user>
  21. </member>

user要素配下のname要素を示すために、絶対ロケーションパスは次のように記述できます。

  1. /member/user/name

上記の絶対ロケーションパスの結果でマッチするのは、3つのname要素ですね。

また、ルートとそのすべての子孫ノードのname要素にマッチさせるためには、下記のように記述もできます。

  1. //name

XPathを取得する

JavaでXPathから要素を取得するサンプルです。

  1. ■記述例
  2. public void GetXpath(String xmlPath,String xpathStr) {
  3.  
  4. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  5. dbf.setNamespaceAware(true);
  6.  
  7. try {
  8. DocumentBuilder db = dbf.newDocumentBuilder();
  9. Document doc = db.parse(new File(xmlPath));
  10. XPath xpath = XPathFactory.newInstance().newXPath();
  11. NodeList nl = (NodeList)xpath.evaluate(xpathStr, doc, XPathConstants.NODESET);
  12. int num = nl.getLength();
  13.  
  14. for(int i=0;i<num;i++) {
  15. Node node1 = nl.item(i);
  16. NodeList nl2 = node1.getChildNodes();
  17. int num2 = nl2.getLength();
  18.  
  19. for(int j=0;j<num2;j++) {
  20. Node node2 = nl2.item(j);
  21.  
  22. if(node2.getNodeType() == Node.TEXT_NODE) {
  23. System.out.println(node2.getTextContent());
  24. }
  25. }
  26. }
  27.  
  28. } catch (ParserConfigurationException e) {
  29. e.printStackTrace();
  30.  
  31. } catch (SAXException e) {
  32. e.printStackTrace();
  33.  
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36.  
  37. } catch (XPathExpressionException e) {
  38. e.printStackTrace();
  39. }
  40. }

また、その他XMLに関する情報は、以下の記事でも詳しく解説しています。

ぜひ参考にしてみてください。

【関連記事】

▶︎JavaでXMLを読み込みする方法を解説!概要や出力方法も合わせて紹介

▶︎【Java】XMLファイルを出力するサンプルコードを紹介!

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。