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

MD Aminul Islam 2023年10月12日
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つの異なる方法について説明しました。 必要に応じて、それらのいずれかを選択できます。

著者: MD Aminul Islam
MD Aminul Islam avatar MD Aminul Islam avatar

Aminul Is an Expert Technical Writer and Full-Stack Developer. He has hands-on working experience on numerous Developer Platforms and SAAS startups. He is highly skilled in numerous Programming languages and Frameworks. He can write professional technical articles like Reviews, Programming, Documentation, SOP, User manual, Whitepaper, etc.

LinkedIn

関連記事 - Java XML

関連記事 - Java Object