• ベストアンサー

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

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

  • Java
  • 回答数1
  • ありがとう数1

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

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

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

TAKE-See
質問者

お礼

ご回答ありがとうございます。 ソースを拝見しましたが、確かに使えそうですね。 その後、自分でも調べてみましたが、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
  • JavaでXMLのNodeツリーをファイル出力したいのですが

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

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

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

  • JSTLで、x:out でXpathを指定してのxmlの要素表示ができません。

    度々の質問で申し訳ございませんが、どなたか分かる方がいらっしゃいましたら教えて下さい。 ※前に投入していた質問は削除させて頂きました。  質問を回答途中であった方にはお詫び申し上げます。大変申し訳ございません。 本題ですが、JSTLのx:out でXpathを指定してのxmlの要素表示ができません。 使用しているソースは下記の通りです。 ---- <%@ page language="java" contentType="text/html;charset=Windows-31J"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%> <html><body> <c:set var="greeting"> <?xml version="1.0"?> <greeting>hello, world</greeting> </c:set> <x:parse var="xml" doc="${greeting}" /> <x:out select="$xml/greeting" /> </body></html> ---- この画面を表示させようとすると、下記のエラーが出てしまいます。 ---- org.apache.jasper.JasperException: Exception in JSP: /jsp/html/xmltest_003.jsp:14 11: <greeting>hello, world</greeting> 12: </c:set> 13: <x:parse var="xml" doc="${greeting}" /> 14: <x:out select="$xml/greeting" /> 15: 16: </body></html> Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:451) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:355) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 原因 javax.servlet.ServletException: org/apache/xpath/XPathException ---- XPathExceptionと出ているので、xpathの指定がおかしいのだと思うのですが、 <x:out select="${xml/greeting}" /> <x:out select="${xml/greeting/text()}" /> <x:out select="$xml/greeting/text()" /> <x:out select="${xml}/greeting" /> <x:out select="${xml}/greeting/text()" /> とやってみてもエラーが表示されます。 ---- c:outは下記で出力できますので、taglibは正常に動いていると思われます。 <%@ page language="java" contentType="text/html;charset=Windows-31J"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html><body> <c:set var="data" value="てすと!!" /> <c:out value="${data}" /> ${data} </body></html> ---- web.xmlの冒頭は、 <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> に変更しました。 ---- web.xmlには<web-app>タグ内の最後に下記の記述を追加しました(抜粋)。 <taglib> <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri> <taglib-location>/WEB-INF/c.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jsp/jstl/xml</taglib-uri> <taglib-location>/WEB-INF/x.tld</taglib-location> </taglib> </web-app> ---- WinXP/Eclipse3.3/Tomcat5.5/GEF3.3/struts-1.3.8/JDK1.5/JSTL1.1.2で動かしています。 ---- どなたかこのエラーについての解決の糸口などがここら辺りでは? とお分かりになる方がいらっしゃいましたら、ご教授頂ければ幸いです。 初歩的な質問で大変恐縮ですが、宜しくお願い致します。

    • ベストアンサー
    • Java
  • 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
  • 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
  • jdkで使用されているXMLパーサ

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

    • ベストアンサー
    • 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
  • 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出来るのです。 端末に依存するのでしょうか? それともこの文字があったらダメというのがあるのでしょうか? 何か情報があればご教示願います。 よろしくお願い致します。

  • 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