Java で XPath を使用して XML データを読み取りたいのですが、収集した情報では要件に従って XML を解析できません。
私がやりたいことは次のとおりです:
URL経由でオンラインからXMLファイルを取得し、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 つだけノード要素を返すようにしたいと考えています。
ベストアンサー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 をループします。