JavaでXMLを解析するときはXPathを使うと便利…だと個人的には思っています。ただ、JavaでXPathを使うにはいろいろ初期化が必要だったり例外が多かったりで使うまでが大変だったりします。XPathについてはhttps://zenn.dev/yu_no/articles/a73a21522b1d41 が参考になりそうです。試しにhttps://d-kami.hatenablog.com/feedからブログの記事のタイトルとその内容の一部を取得してみましょう。JavaのNodeListは拡張for文もJava Stream APIも使えないので通常のfor文でループしていきます。またサンプルとして見やすくするために例外処理を書いていませんが実際はいろいろ例外が発生します(throws Exceptionはやりすぎな気もするが)。どんな例外が発生するか知りたい場合はmainメソッドのthrows Exceptionを外せば見れます。
import java.net.URI; import org.w3c.dom.NodeList; import javax.xml.xpath.XPathFactory; import javax.xml.xpath.XPathConstants; import javax.xml.parsers.DocumentBuilderFactory; public class XPathSample{ public static void main(String... args) throws Exception{ var url = URI.create("https://d-kami.hatenablog.com/feed").toURL(); var connection = url.openConnection(); var factory = DocumentBuilderFactory.newInstance(); var document = factory.newDocumentBuilder().parse(connection.getInputStream()); var xpath = XPathFactory.newInstance().newXPath(); //feedタグの下のタイトルタグに挟まれたテキストを取得する System.out.println(xpath.evaluate("/feed/title/text()", document)); //feedタグの下のauthorタグのさらに下のnameタグに挟まれたテキストを取得する System.out.println(xpath.evaluate("/feed/author/name/text()", document)); System.out.println(); //feedタグの下のentryタグに挟まれた直下のタグの一覧を取得する(ここでは複数のentryタグがリストで返ってきます) var list = (NodeList)xpath.evaluate("/feed/entry", document, XPathConstants.NODESET); //entryタグの一覧を一つずつ取得していく for(int i = 0; i < list.getLength(); i++){ var node = list.item(i); System.out.println("---------------------"); //entryタグの下のtitleタグに挟まれたテキストを表示する System.out.println(xpath.evaluate("./title/text()", node)); System.out.println(); //entryタグの下のcontentタグに挟まれたテキストを表示する System.out.println(xpath.evaluate("./content/text()", node)); System.out.println("---------------------"); } } }