0

数週間前、ノード要素のカウントについて質問したところ、多くのことを理解するのに役立つ素晴らしい回答が得られました。ここにリンクします。

しかし、今は別の状況にあることがわかり、そのための良い解決策を見つけることができません.

それは私が扱う必要があるコードです:

<?xml version="1.0" encoding="UTF-8"?>

<bookstore>
    <books>
        <book id="1">
            <title="Everyday Italian" category="cooking" year="2005" price="30.00"/>
            <author name ="Giada De Laurentiis"/>
        </book>
        <book id="2">
            <title="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>

これを使用して著者の数を取得します(理解するには、ここで前の質問を確認してください):

eElement.getElementsByTagName("author").getLength()

内に要素がなく、パラメーターだけであるため、NULL を返します。

それはちょっと明白ですが、作成者を解析するために NodeList を作成するとき

doc.getElementsByTagName("author");

5 人の著者全員を取得したので、2 冊目の本の著者だけが必要な場合は、間違った情報を取得することになります。

各本から適切な数の著者を解析する良い方法を知りたいです。

前もって感謝します。

4

2 に答える 2

0

eElement.getElementsByTagName("book") を使用して書籍を検索し、次にリストの書籍要素ごとに bElement.getElementsByTagName("author") を使用して著者を検索できます。

于 2013-09-16T12:21:25.163 に答える
0

開始するにはもう少し作業が必要ですが、私は 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"
于 2013-09-13T22:01:48.897 に答える