1. ホーム

[解決済み】JavaでXPathを使ってXMLを読み込む方法

2022-04-16 21:06:42

質問

私はJavaでXPathを使用してXMLデータを読みたいので、私が収集した情報については、私は私の要件に応じてXMLを解析することができません。

以下は、私がやりたいことです。

オンラインからXMLファイルをURLで取得し、XPathでパースするのですが、その中に2つのメソッドを作りたいと考えています。1つは、特定のノード属性IDを入力し、結果としてすべての子ノードを取得するもので、もう1つは、特定の子ノードの値のみを取得するものです。

<?xml version="1.0"?>
<howto>
  <topic name="Java">
      <url>http://www.rgagnonjavahowto.htm</url>
  <car>taxi</car>
  </topic>
  <topic name="PowerBuilder">
       <url>http://www.rgagnon/pbhowto.htm</url>
       <url>http://www.rgagnon/pbhowtonew.htm</url>
  </topic>
  <topic name="Javascript">
        <url>http://www.rgagnon/jshowto.htm</url>
  </topic>
 <topic name="VBScript">
       <url>http://www.rgagnon/vbshowto.htm</url>
 </topic>
 </howto>

上記の例では、@nameで検索するとすべての要素が読み込まれるようにしています。また、@nameの「Javascript」からのurlを1つのノード要素だけ返す関数も用意しています。

どのように解決するのですか?

このようなものが必要です。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(<uri_as_string>);
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile(<xpath_expression>);

そして expr.evaluate() そのコードで定義されたドキュメントと、期待する戻り値の型を渡し、その結果をオブジェクト型にキャストします。

特定のXPath式について助けが必要な場合は、おそらく別の質問として尋ねるべきでしょう(それがここでの最初の質問でない限り、私はあなたの質問がJavaでのAPIの使用方法であると理解しました)。

編集部:(コメントへの返信)。このXPath式は、PowerBuilderの下で最初のURL要素のテキストを取得します。

/howto/topic[@name='PowerBuilder']/url/text()

これで2番目を取得します。

/howto/topic[@name='PowerBuilder']/url[2]/text()

このコードで得られます。

expr.evaluate(doc, XPathConstants.STRING);

もし、あるノードにいくつのURLがあるかわからない場合は、むしろこのような方法をとるべきでしょう。

XPathExpression expr = xpath.compile("/howto/topic[@name='PowerBuilder']/url");
NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);

そして、NodeListをループさせる。