開始するにはもう少し作業が必要ですが、私は XPath を使用することを好みます。これは、XML をクエリするためのより堅牢な方法です...
XML の例を更新した後、読み取れるように...
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<books>
<book id="1">
<title name="Everyday Italian" category="cooking" year="2005" price="30.00"/>
<author name ="Giada De Laurentiis"/>
</book>
<book id="2">
<title name="XQuery Kick Start" category="web" year="2003" price="49.99"/>
<author name ="James McGovern"/>
<author name ="Per Bothner"/>
<author name ="Kurt Cagle"/>
<author name ="James Linn"/>
</book>
</books>
</bookstore>
これを使った...
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class TestXPath100 {
public static void main(String[] args) {
InputStream is = null;
try {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("Test.xml"));
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
XPathExpression exp = xPath.compile("//author");
NodeList nl = (NodeList) exp.evaluate(doc, XPathConstants.NODESET);
System.out.println(nl.getLength());
} catch (ParserConfigurationException | XPathExpressionException | SAXException | IOException ex) {
} finally {
try {
is.close();
} catch (Exception e) {
}
}
}
}
どの出力5
.
基本的に、xPath クエリは、名前が付けられたドキュメント内のすべてのノードを検索します。author
詳細については、XPath チュートリアルをご覧ください。
追加の例で更新
時間をかけてXPath チュートリアルを読んだことがあれば、XPath が XML のクエリ言語であることがわかるでしょう (SQL がデータベースのクエリ言語であるのと少し似ています)...
そこでname
、一致したすべての要素の属性をダンプするようにコードを変更し、クエリを使用しました//book[title[@name='Everyday Italian']]/author
XPathExpression exp = xPath.compile("//book[title[@name='Everyday Italian']]/author");
NodeList nl = (NodeList) exp.evaluate(doc, XPathConstants.NODESET);
for (int index = 0; index < nl.getLength(); index++) {
Node node = nl.item(index);
System.out.println(node.getAttributes().getNamedItem("name"));
}
そして、それは出力されました...
name="Giada De Laurentiis"
クエリを次のように変更する//book[title[@name='XQuery Kick Start']]/author
と、出力されました...
name="James McGovern"
name="Per Bothner"
name="Kurt Cagle"
name="James Linn"