18

要素名を取得して XML でデータを出力したいのですが、特定の要素の下のデータを取得する方法がわかりません。

これが XML サンプルと私のコードです。

   <mdb>
    <movies>
    <movie id="godfather">
      <title>The Godfather</title>
      <year>1972</year>
      <directors>
        <director idref="francisfordcoppola"/>
      </directors>
      <genres>
        <genre>Crime</genre>
        <genre>Drama</genre>
      </genres>
       <cast>
        <performer>
          <actor idref="marlonbrando"/>
          <role>Don Vito Corleone</role>
        </performer>
     </cast>
    </movie>
    </movies>

    <performer id="kimnovak">
      <name>Marilyn Pauline Novak</name>
      <dob>1933-02-13</dob>
      <pob>Chicago, Illinois, USA</pob>
      <actedin>
        <movie idref="vertigo"/>
      </actedin>
    </performer>
    </mdb>



try {
        File fXmlFile = new File(filename);
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);

        NodeList nodes = doc.getElementsByTagName("movie");
         System.out.println("nodes length"+ nodes.getLength());
        for (int i = 0; i < nodes.getLength(); i++){
            Element element = (Element) nodes.item(i);
            NodeList name = element.getElementsByTagName("title");
            Element line = (Element) name.item(0);
            System.out.println(": " + line.getFirstChild().getTextContent());

映画内の要素のみを取得したい。ただし、次のコード <movie idref="vertigo"/>は実行者の内部も読み取ります (コンテンツを取得したい場合は Nullpointer 例外が発生します)。DOMを使用してパフォーマンスの下での読み取りを回避する方法があるかどうか疑問に思っていますか?

NodeList nodes = doc.getElementsByTagName("movie");

最初のムービーの最終出力は次のようになります。

('godfather', 'The Godfather', '1972', 'Crime;Drama')
4

3 に答える 3

21

これを行う 1 つの方法は、movie タグではなく、movies タグから読み取りを開始することです。これがあなたが探しているものかどうかわからない!!.

NodeList nodes = doc.getElementsByTagName("movies");

Element element = (Element) nodes.item(0);
NodeList movieList = element.getElementsByTagName("movie");
for (int i = 0; i < movieList.getLength(); i++) {
    Element movieElement = (Element) movieList.item(i);
    System.out.println(movieElement.getAttributes().getNamedItem("id").getNodeValue());
    NodeList name = movieElement.getElementsByTagName("title");
    NodeList year = movieElement.getElementsByTagName("year");
    NodeList genres = movieElement.getElementsByTagName("genres");
    Element genreline = (Element) genres.item(0);

    System.out.println(name.item(0).getFirstChild().getTextContent());
    System.out.println(year.item(0).getFirstChild().getTextContent());
    System.out.println(genreline.getElementsByTagName("genre").item(0).getTextContent() 
               + ":" + genreline.getElementsByTagName("genre").item(1).getTextContent());
}

出力:

: ゴッドファーザー
: ゴッドファーザー
: 1972
: 犯罪:ドラマ

于 2013-02-08T06:59:32.223 に答える
3

XPathを読むことをお勧めします。ここにいくつかのがあります。

たとえば、映画の年を読み取るには、XPathを使用できます...

/mdb/movies/movie/year/text()
于 2013-02-07T03:38:09.303 に答える
2

私は同じ問題を抱えていました、これは私の実装です、

public String getTagValue(org.w3c.dom.Document xmlDoc, String tagName) throws Exception {
        xmlDoc.getDocumentElement().normalize();

        NodeList nodeList = xmlDoc.getElementsByTagName(tagName);

        for (int temp = 0; temp < nodeList.getLength(); temp++) {
            Node nNode = nodeList.item(temp);
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                org.w3c.dom.Element eElement = (org.w3c.dom.Element) nNode;
                return eElement.getFirstChild().getNodeValue();
            }
        }
        return "-1";
    }
于 2019-01-17T03:32:00.137 に答える