JavaでXMLファイルを読む方法 - (DOM Parser)

JavaでXMLファイルを読み取る方法-(DOMパーサー)

このチュートリアルでは、DOM XML parserを介してXMLファイルを読み取る方法を示します。 DOM parser parses the entire XML document and loads it into memory; then models it in a “TREE” structure for easy traversal or manipulation.

つまり、XMLファイルをDOMまたはツリー構造に変換します。必要なものを取得するには、ノードごとにトラバースする必要があります。

What is Node?
DOMでは、XMLドキュメント内のすべてがノードread thisです。

Warning
DOMパーサーは低速であり、大量のデータを含むXMLドキュメントをロードするときに大量のメモリを消費します。 SAXパーサーをそのソリューションとして考えてください。SAXはDOMよりも高速で、使用するメモリも少なくなります。

1. DOM XMLパーサーの例

この例では、「名前」でノードを取得し、値を表示する方法を示します。

/Users/example/staff.xml


    
        yong
        mook kim
        example
        100000
    
    
        low
        yin fong
        fong fong
        200000
    

ReadXMLFile.java

package com.example.seo;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

public class ReadXMLFile {

  public static void main(String argv[]) {

    try {

    File fXmlFile = new File("/Users/example/staff.xml");
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(fXmlFile);

    //optional, but recommended
    //read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
    doc.getDocumentElement().normalize();

    System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

    NodeList nList = doc.getElementsByTagName("staff");

    System.out.println("----------------------------");

    for (int temp = 0; temp < nList.getLength(); temp++) {

        Node nNode = nList.item(temp);

        System.out.println("\nCurrent Element :" + nNode.getNodeName());

        if (nNode.getNodeType() == Node.ELEMENT_NODE) {

            Element eElement = (Element) nNode;

            System.out.println("Staff id : " + eElement.getAttribute("id"));
            System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent());
            System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent());
            System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname").item(0).getTextContent());
            System.out.println("Salary : " + eElement.getElementsByTagName("salary").item(0).getTextContent());

        }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
  }

}

結果

Root element :company
----------------------------

Current Element :staff
Staff id : 1001
First Name : yong
Last Name : mook kim
Nick Name : example
Salary : 100000

Current Element :staff
Staff id : 2001
First Name : low
Last Name : yin fong
Nick Name : fong fong
Salary : 200000

2. ノードのループ

この例では、同じ「staff.xml」を読み取り、ノードを1つずつループし、ノードの名前と値、および存在する場合は属性を出力する方法を示します。

ReadXMLFile2.java

package com.example.seo;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXMLFile2 {

  public static void main(String[] args) {

    try {

    File file = new File("/Users/example/staff.xml");

    DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance()
                             .newDocumentBuilder();

    Document doc = dBuilder.parse(file);

    System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

    if (doc.hasChildNodes()) {

        printNote(doc.getChildNodes());

    }

    } catch (Exception e) {
    System.out.println(e.getMessage());
    }

  }

  private static void printNote(NodeList nodeList) {

    for (int count = 0; count < nodeList.getLength(); count++) {

    Node tempNode = nodeList.item(count);

    // make sure it's element node.
    if (tempNode.getNodeType() == Node.ELEMENT_NODE) {

        // get node name and value
        System.out.println("\nNode Name =" + tempNode.getNodeName() + " [OPEN]");
        System.out.println("Node Value =" + tempNode.getTextContent());

        if (tempNode.hasAttributes()) {

            // get attributes names and values
            NamedNodeMap nodeMap = tempNode.getAttributes();

            for (int i = 0; i < nodeMap.getLength(); i++) {

                Node node = nodeMap.item(i);
                System.out.println("attr name : " + node.getNodeName());
                System.out.println("attr value : " + node.getNodeValue());

            }

        }

        if (tempNode.hasChildNodes()) {

            // loop again if has child nodes
            printNote(tempNode.getChildNodes());

        }

        System.out.println("Node Name =" + tempNode.getNodeName() + " [CLOSE]");

    }

    }

  }

}

結果:

Root element :company

Node Name =company [OPEN]
Node Value =

        yong
        mook kim
        example
        100000


        low
        yin fong
        fong fong
        200000



Node Name =staff [OPEN]
Node Value =
        yong
        mook kim
        example
        100000

attr name : id
attr value : 1001

Node Name =firstname [OPEN]
Node Value =yong
Node Name =firstname [CLOSE]

Node Name =lastname [OPEN]
Node Value =mook kim
Node Name =lastname [CLOSE]

Node Name =nickname [OPEN]
Node Value =example
Node Name =nickname [CLOSE]

Node Name =salary [OPEN]
Node Value =100000
Node Name =salary [CLOSE]
Node Name =staff [CLOSE]

Node Name =staff [OPEN]
Node Value =
        low
        yin fong
        fong fong
        200000

attr name : id
attr value : 2001

Node Name =firstname [OPEN]
Node Value =low
Node Name =firstname [CLOSE]

Node Name =lastname [OPEN]
Node Value =yin fong
Node Name =lastname [CLOSE]

Node Name =nickname [OPEN]
Node Value =fong fong
Node Name =nickname [CLOSE]

Node Name =salary [OPEN]
Node Value =200000
Node Name =salary [CLOSE]
Node Name =staff [CLOSE]
Node Name =company [CLOSE]

Note
このHow to get Alexa Ranking In Javaに興味があるかもしれません。 It shows you how to use DOM to parse the Alexa XML result.