HOWTO · Java

XML を Java オブジェクトに解析

このチュートリアルでは、XML を解析して Java オブジェクトにする方法について説明します。

このページの内容

XML は、あらゆるソフトウェア環境でデータを保存、変更、および共有するために最も広く使用されているテクノロジーです。 XML ファイルが到着すると、最初の仕事はそれを解析して処理することです。

この記事では、Java で XML を解析してオブジェクトに変換する方法について説明します。

XML を Java オブジェクトに解析

Java で XML ファイルを解析する場合、一般的で最もよく使用されるパーサーが Java で利用できます。 DOM ParserSAX ParserStAX Parser が最も人気があります。

これらの各 XML パーサーの例を見ていきます。 しかし、始める前に、以下のような XML ファイルがあるとします。

<?xml version = "1.0"?>
<class>
   <person ID = "293">
      <firstname>Alen</firstname>
      <lastname>Walker</lastname>
      <email>alen@email.com</email>
   </person>

   <person ID = "393">
      <firstname>Stefen</firstname>
      <lastname>Dev</lastname>
      <email>stefen@email.com</email>
   </person>

   <person ID = "493">
      <firstname>John</firstname>
      <lastname>Doe</lastname>
      <email>john@email.com</email>
   </person>
</class>

方法 1: DOM Parser を使用して XML を Java オブジェクトに解析する

コード例:

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

public class JavaXMLParsing {
  public static void main(String[] args) {
    try {
      // Locating the file
      File MyFile = new File("G:\\Order 011\\BATCH\\Myxml.xml");

      // Creating a document object document builder.
      DocumentBuilderFactory DBF = DocumentBuilderFactory.newInstance();
      DocumentBuilder DB = DBF.newDocumentBuilder();
      Document DOC = DB.parse(MyFile);
      DOC.getDocumentElement().normalize();
      // Printing the root element
      System.out.println("Root element: " + DOC.getDocumentElement().getNodeName());

      // Find the primary node
      NodeList NodeList = DOC.getElementsByTagName("person");

      // Extracting data from child node
      for (int itr = 0; itr < NodeList.getLength(); itr++) {
        Node MyNode = NodeList.item(itr);
        System.out.println("\nNode Name:" + MyNode.getNodeName());
        if (MyNode.getNodeType() == Node.ELEMENT_NODE) {
          Element element = (Element) MyNode;
          System.out.println(
              "First Name: " + element.getElementsByTagName("firstname").item(0).getTextContent());
          System.out.println(
              "Last Name: " + element.getElementsByTagName("lastname").item(0).getTextContent());
          System.out.println(
              "Email: " + element.getElementsByTagName("email").item(0).getTextContent());
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

出力:

Root element: class

Node Name: person
First Name: Alen
Last Name: Walker
Email: alen@email.com

Node Name: person
First Name: Stefen
Last Name: Dev
Email: stefen@email.com

Node Name: person
First Name: John
Last Name: Doe
Email: john@email.com

作業する前に、DOM Parser jar ファイルをダウンロードする必要があることを忘れないでください。 こちらから入手できます。

方法 2: SAX Parser を使用して XML を Java オブジェクトに解析する

コード例:

// importing necessary files
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class JavaSAXParser {
  public static void main(String argv[]) {
    try {
      // Organizing a SAXParser
      SAXParserFactory MyFactory = SAXParserFactory.newInstance();
      SAXParser SaxParser = MyFactory.newSAXParser();

      // Creating a default handler
      DefaultHandler MyHandler = new DefaultHandler() {
        boolean firstname = false;
        boolean lastname = false;
        boolean email = false;
        // Extracting data from the XML
        public void startElement(String uri, String localName, String qName, Attributes attributes)
            throws SAXException {
          if (qName.equalsIgnoreCase("firstname")) {
            firstname = true;
          }
          if (qName.equalsIgnoreCase("lastname")) {
            lastname = true;
          }
          if (qName.equalsIgnoreCase("email")) {
            email = true;
          }
        }
        public void characters(char ch[], int start, int length) throws SAXException {
          if (firstname) {
            System.out.println("First Name: " + new String(ch, start, length));
            firstname = false;
          }
          if (lastname) {
            System.out.println("Last Name: " + new String(ch, start, length));
            lastname = false;
          }
          if (email) {
            System.out.println("Email: " + new String(ch, start, length));
            email = false;
          }
        }
      };
      SaxParser.parse("G:\\Order 011\\BATCH\\Myxml.xml", MyHandler);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

出力:

First Name: Alen
Last Name: Walker
Email: alen@email.com
First Name: Stefen
Last Name: Dev
Email: stefen@email.com
First Name: John
Last Name: Doe
Email: john@email.com

方法 3: StAX Parser を使用して XML を Java オブジェクトに解析する

コード例:

// importing necessary files
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Iterator;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.*;

public class JavaSTAXparser {
  private static boolean firstname, lastname, email;

  public static void main(String[] args) throws FileNotFoundException, XMLStreamException {
    // Locating the file
    File file = new File("G:\\Order 011\\BATCH\\Myxml.xml");
    // Parsing the file with the parse() method
    parser(file);
  }

  // The parse() method
  public static void parser(File file) throws FileNotFoundException, XMLStreamException {
    firstname = lastname = email = false;
    // Declaring a XMLInputFactory object
    XMLInputFactory MyFactory = XMLInputFactory.newInstance();
    // Declaring a XMLEventReader object
    XMLEventReader EventReader = MyFactory.createXMLEventReader(new FileReader(file));

    while (EventReader.hasNext()) {
      // Creating a xml event
      XMLEvent Event = EventReader.nextEvent();

      if (Event.isStartElement()) {
        // Extracting data from the xml file
        StartElement Element = (StartElement) Event;
        Iterator<Attribute> iterator = Element.getAttributes();

        while (iterator.hasNext()) {
          Attribute attribute = iterator.next();
          QName name = attribute.getName();
          String value = attribute.getValue();
          System.out.println(name + " = " + value);
        }
        if (Element.getName().toString().equalsIgnoreCase("firstname")) {
          firstname = true;
        }
        if (Element.getName().toString().equalsIgnoreCase("lastname")) {
          lastname = true;
        }
        if (Element.getName().toString().equalsIgnoreCase("email")) {
          email = true;
        }
      }
      if (Event.isEndElement()) {
        EndElement Element = (EndElement) Event;

        if (Element.getName().toString().equalsIgnoreCase("firstname")) {
          firstname = false;
        }
        if (Element.getName().toString().equalsIgnoreCase("lastname")) {
          lastname = false;
        }
        if (Element.getName().toString().equalsIgnoreCase("email")) {
          email = false;
        }
      }
      if (Event.isCharacters()) {
        Characters Element = (Characters) Event;
        if (firstname) {
          System.out.println(Element.getData());
        }
        if (lastname) {
          System.out.println(Element.getData());
        }
        if (email) {
          System.out.println(Element.getData());
        }
      }
    }
  }
}

出力:

ID = 293
Alen
Walker
alen@email.com
ID = 393
Stefen
Dev
stefen@email.com
ID = 493
John
Doe
john@email.com

上記では、XML を Java オブジェクトに解析し、そこからデータを抽出する 3つの異なる方法について説明しました。 必要に応じて、それらのいずれかを選択できます。