• ベストアンサー
  • すぐに回答を!

XMLのNodeからXPathを生成(逆引き?)したい

お世話になっております。 Javaで、よくXMLのNodeをXPathを使って検索する例を見かけるのですが、 逆に、XML中のNodeからXPathのロケーションステップを調べる方法は どうやったらよいでしょうか。 Nodeには必ずユニークなロケーションステップが割り当てられるので、 APIがあればできそうな気がするのですが、分かりません。 Java SE 6 APIでできるならベストですが、OSSのライブラリを使っても 構いません。ご存知の方がいらっしゃったらご教示ください。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数882
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

なかなか要件に見合うものはありませんね。 OSS ScriptellaProject(ttp://scriptella.javaforge.com/)の scriptella.configuration.XmlElementの内部実装#getXPathメソッド あたりがかなり使えそうな気がします。 くれぐれもライセンス利用にはご注意を。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 ソースを拝見しましたが、確かに使えそうですね。 その後、自分でも調べてみましたが、Eclipse 3.5 の org.eclipse.wst.xml.xpath.core.util.XSLTXPathHelper の #calculateXPathToNodeメソッドでも同じような結果を得られそうでした。 最悪は、XPathといってもテキストだから手作業で作ればいいかな・・・と 思っていたところでしたので、大変参考になりました。

関連するQ&A

  • XML::XPathでのfor文の記述

    たびたびお世話になります。よろしくお願いいたします。 perlでXML文書をHTMLへ変換しています。 ---------------------------------------- <!-- file.xml --> <root> <jouhou> <mei> <toushu>あ</toushu> <toushu>い</toushu> <toushu>う</toushu> </mei> <mei> <toushu>え</toushu> <toushu>お</toushu> <toushu>か</toushu> </mei> </jouhou> </root> ---------------------------------------- このようなXMLの場合に、XML::XPathで「あ」と「え」などの最初に来る<toushu>取りたいのですが 日によって<mei>の数が異なるため、<mei>の数を取得してその数でforをすることにしました。 が、うまくいきません。 my $xp = new XML::XPath( filename => "./file.xml" ); for(my $j=1;$j<=$xp->findvalue("count(//jouhou/mei/toushu)");$j++){ print $j; #←ここでは1と2が出ます。 print $xpath->find('//jouhou/mei[$j]/toushu')->get_node(1)->string_value; } このままでは全く出なく、["$j"]とすると、出るには出るのですが「あ」が2回出てしまいます。 書き方が違うと思うのですが、()でくくってみても出ません。 ちなみに print $xpath->find('//jouhou/mei[1]/toushu')->get_node($j)->string_value; だと、ちゃんと「あ」と「い」が出ました…。 もし、お分かりになれば教えていただきたいです。 お手数をおかけしますが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • XPathFactory

    お世話になります。 XPathを使ったクラスについて、 コンパイルは通ったのですが、 実行時に以下の例外が発生します。 何か考えられる原因などありますでしょうか? リファレンスにはnewInstanceは失敗しないと 書いてあるのですが・・・ : import javax.xml.xpath.XPath; : XPathFactory factory = XPathFactory.newInstance(); *ここで例外発生*    ↓ java.lang.RuntimeException: XPathFactory#newInstance() failed to create an XPath Factory for the default object model: http://java.sun.com/jaxp/xpath/dom with th e XPathFactoryConfigurationException: javax.xml.xpath.XPathFactoryConfigurationE xception: No XPathFctory implementation found for the object model: http://java. sun.com/jaxp/xpath/dom

    • ベストアンサー
    • Java
  • JavaでXMLのNodeツリーをファイル出力したいのですが

    こんにちは、domagooです。 Javaで、XMLのNodeツリーの内容をファイル出力したいと思っています。 MSXMLですと、IXMLDOMDocumentオブジェクトに対して、 pXmlTree -> save("ファイルパス"); で、ツリーの内容を一度にファイルに保存することができますが、Javaにもそのようなツリーの内容を一度に保存する方法はありますでしょうか。 もし一度に保存する方法がなければ、どのような方法で保存するのが一般的であるか、ご教示ください。

    • ベストアンサー
    • Java
  • XMLファイルを読み書きしたい

    WindowsXP+VC++6.0です。 タイトルの通り、XMLファイルから値を読み込んだり書き込んだりしたいのですが、javaのSAXのように簡単に使えるAPIやクラスライブラリをご存知ないでしょうか?

  • JavaでXMLといったら何を使いますか?

    JavaでXMLファイルを取り扱うときには、DOM, SAX, xerces, relaxer, XMLSchema, XPathといったキーワードが出てきますが、とりあえずXMLファイルを読めればいい、というときはどのライブラリを使うのがいいのでしょうか? 利用目的としては、単純なXMLからデータを読み込んで、それをVelocityテンプレートとマージしてファイルに保存することを考えています。 例 <javafile>  <name>Foo.java</name>  <class>   <modifier>public</modifier>   <name>Foo</name>   <method>    <modifier>public</modifier>    <modifier>static</modifier>    <type>void</type>    <name>main</name>    <arg>     <type>String[]</type>     <name>args</name>    </arg>    <body>     System.out.println("Hello");    </body>   </method>  </class> </javafile> から public class Foo{  public static void main(String[] args){   System.out.println("Hello");  } } を作る感じです。

    • ベストアンサー
    • Java
  • DOMでパースしているXML全体の出力方法

    お世話になります。 JavaでDOMを使ってXML操作をしたいと考えております。 おおよそ、以下のソースでparseできるところまで確認できました。 DOMParser parser = new DOMParser(); parser.parse("XMLファイルパス"); Document doc = parser.getDocument(); 開発中なので、DOM操作した結果のXMLを随時コンソールやログに 出力させたいのですが、たとえばdoc.toString()してもnullとなり、 正常に出力されません。 以下のようにElementを取得すると正常にアクセスできていることは 確認しています。 Element rootEl = doc.getDocumentElement(); System.out.println(rootEl.getNodeName()); なお、DOMライブラリにはxercesを用いております。 Dom4jのAPIも見てみましたが、それらしいメソッドを見つけることが できていません。 簡単にXMLを出力できることが理想です。 一般的な方法、よくやる手法など、みなさんよりご教示頂きたいです。

    • ベストアンサー
    • Java
  • Rubyにおける、XPathの関数「text()="x"」への変数の使

    Rubyにおける、XPathの関数「text()="x"」への変数の使用方法 お世話になります。 RubyにてXPathの関数「text()="x"」"x"の部分に変数を使用したいと思い、コードを作成しています。 text() 関数のところで困っています。 例えば <?xml version="1.0" encoding="UTF-16"?> <NameRoot> <Text> <Name>あああああ</Name> <No>001</No> </Text> <Text> <Name>いいいいい</Name> <No>002</No> </Text> <Text> <Name>ううううう</Name> <No>003</No> </Text> </NameRoot> の内容のファイルを読み込み、その中から該当するNoに相当するNameを取得しようと しています。 で、書いたのが下記のような内容なのですが、gettestクラスのgetNameメソッドにて コメントアウトしてある行であれば、決め打ちでNo="001"の物を取ってこれるのですが、 ここに引数として渡されたローカル変数の、idを使用しようとするとnode変数にNilClass が返ってきて取得できません。 文字列リテラルを色々調べてみたのですが、どうも上手く行かず困っています。 他愛も無い質問かもしれませんが、大変困っています。 どなたか知恵をお貸しくださいますようお願い致します。 class gettest def getName(id) #↓これがきちんと動きません node = REXML::XPath.first(@masterdata, '//NameRoot/Text/No[text()="#{id}")]') #↓こちらは当然ながら動きます # node = REXML::XPath.first(@masterdata, '//NameRoot/Text/No[text()="001"]') path = (node.xpath + "/../Name") @name = @masterdata.elements[path].text() end end class main def edit @mastername = "" @mastername = @master.getName("001") print @mastername end end

    • ベストアンサー
    • Ruby
  • Load出来ないXMLファイル

    いつもお世話になっております。 標題の件なのですが、VB.NETでXMLファイルから設定情報(Oracleのユーザー名やパスワード等)を取得するプログラムを作成しております。 以下がそのソースコードになります。 ※VB.NET初心者なので、ネットにあったサンプルコードを参考にしました。 --------------------------------------------------   Public Function Setting_init() As Boolean     Dim xmlDoc As New DOMDocument30     Dim Node As IXMLDOMNode     Dim myErr     Dim FileName As String     FileName = "ini.xml"     Const PATH_DTS = "//Settings/Database/DataSource"     Const PATH_UID = "//Settings/Database/UserId"     Const PATH_PSW = "//Settings/Database/Password"     Const PATH_FRM = "//Settings/Path/Form"     Const PATH_OUT = "//Settings/Path/Output"     xmlDoc.async = False     xmlDoc.resolveExternals = False     xmlDoc.load(FileName)          If (xmlDoc.parseError.errorCode <> 0) Then       myErr = xmlDoc.parseError       Setting_init = False     Else       xmlDoc.setProperty("SelectionLanguage", "XPath")       Node = xmlDoc.selectSingleNode(PATH_DTS)       G_DataSorce = Node.text       Node = xmlDoc.selectSingleNode(PATH_UID)       G_UsrId = Node.text       Node = xmlDoc.selectSingleNode(PATH_PSW)       G_PassWord = Node.text       Node = xmlDoc.selectSingleNode(PATH_FRM)       G_FormPath = Node.text       Node = xmlDoc.selectSingleNode(PATH_OUT)       G_OutPath = Node.text       Setting_init = True     End If   End Function -------------------------------------------------- ちなみにXMLファイルの内容は -------------------------------------------------- <?xml version="1.0" encoding="utf-8"?> <Settings>  <Database>   <DataSource>Oracleサーバー名</DataSource>   <UserId>ユーザー名</UserId>   <Password>パスワード</Password>  </Database>  <Path>   <Form>フォームが存在するフォルダパス</Form>   <Output>ファイルを出力するフォルダパス</Output>  </Path> </Settings> -------------------------------------------------- となっております。 お客様の環境で実行したら、このプログラムのxmlDoc.load(FileName)の箇所でエラーが出ました。 読み取るXMLファイル内の漢字を除いたら実行できたみたいなのですが、 開発環境ではXMLファイルに漢字を含んでいても問題なくload出来るのです。 端末に依存するのでしょうか? それともこの文字があったらダメというのがあるのでしょうか? 何か情報があればご教示願います。 よろしくお願い致します。

  • jdkで使用されているXMLパーサ

    いつもお世話になります。 jdkで使用されているXMLパーサは何なのでしょうか。 javaでXMLを操作するに当たり、jaxpというapiが用意されていますが、jaxpはあくまでdomやsaxの 実装クラスをラップしたものだという認識でいます。 では何の実装クラスが使われているのでしょうか。各パージョンで何が使われているのか知りたいです。 また、ここら辺の事を説明しているサイトがあれば教えて頂けると嬉しいです。 宜しくお願いします。

    • ベストアンサー
    • Java
  • Javaにて複数のxmlファイル内の項目集計

    Javaのバッチの設計を行っている中で挙がった要望からの質問です。 『質問』 Javaにて、複数のxmlファイルから、特定の項目の値のみを 一括で検索・集計するライブラリはありますでしょうか? ------------------------------------------------ 例)説明目的でタグ名は日本語表記です test1.xml <商品一覧> <商品> <品名>aaa</品名> <在庫>100</在庫> <販売日>20110826</販売日> </商品> <商品> <品名>bbb</品名> <在庫>200</在庫> <販売日>20110827</販売日> </商品> </商品一覧> test2.xml <商品一覧> <商品> <品名>aaa</品名> <在庫>300</在庫> <販売日>20110827</販売日> </商品> <商品> <品名>ccc</品名> <価格>50</価格> <販売日>20110828</販売日> </商品> </商品一覧> ↓ ここでtest1.xmlとtest2.xmlから ・品名aaaの在庫数の合計を検索したい ・発売日が20110827以降の商品を検索したい ------------------------------------------------ 単純に考えれば「全部読み込んで上から順番に該当分だけをバッファに詰め込んで~」 で済みますが、読み込みたいxmlファイルが数百ファイル、 全部で最大2ギガと膨大であるため、 「確かxmlと条件を指定すればSQLみたく  結果だけを返してくれるライブラリがあったような・・・  でも検索しても有料のツールぐらいしか出てこない。」 で、今回の質問に至ります。 Javaのプログラムにおいて例に挙げた目的に対する手段 またはライブラリについて心当たりがある方、情報よろしくお願い致します。 ※手段またはライブラリの存在有無の質問であり、  「○○というのがあるけど今回の目的だと処理が重くなりすぎて使い物にならない」  という事でも構いません。 ※勤務中は書き込みできない為、返信は翌日の夜以降となります。