XML을 Java 객체로 구문 분석

MD Aminul Islam 2023년10월12일
XML을 Java 객체로 구문 분석

XML은 모든 소프트웨어 환경에서 데이터를 저장, 수정 및 공유하는 데 가장 널리 사용되는 기술입니다. XML 파일이 도착하면 첫 번째 작업은 파일을 분석하여 작업하는 것입니다.

이 기사에서는 Java에서 XML을 구문 분석하고 객체로 변환하는 방법에 대해 설명합니다.

XML을 Java 객체로 구문 분석

Java에서 XML 파일을 구문 분석할 때 일반적이고 가장 많이 사용되는 일부 구문 분석기를 Java에서 사용할 수 있습니다. DOM 파서, SAX 파서StAX 파서가 가장 많이 사용됩니다.

우리는 이러한 각 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 파서를 사용하여 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 파서를 사용하여 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 개체로 구문 분석하고 여기에서 데이터를 추출하는 세 가지 방법에 대해 설명했습니다. 필요에 따라 이들 중 하나를 선택할 수 있습니다.

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