[java] XML 파일에서 특정 요소 필터링하기

XML (eXtensible Markup Language)은 데이터를 저장하고 전송하기 위한 텍스트 기반의 마크업 언어입니다. Java 언어를 이용하여 XML 파일에서 특정 요소를 필터링하는 방법에 대해 알아보겠습니다.

XML 파싱

XML 파일을 파싱하여 트리 구조로 변환하는 것이 필요합니다. Java에서는 DOM(Document Object Model) 또는 SAX(Simple API for XML)를 사용하여 XML을 파싱할 수 있습니다.

DOM 파싱

DOM 파싱은 XML 데이터를 트리 구조로 읽고 메모리에 로드합니다. 다음은 DOM을 사용하여 XML을 파싱하는 예제입니다.

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 DomParserDemo {
   public static void main(String[] args) {
      try {
         File inputFile = new File("input.xml");
         DocumentBuilderFactory dbFactory 
            = DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
         Document doc = dBuilder.parse(inputFile);
         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();
      }
   }
}

SAX 파싱

SAX 파싱은 이벤트 중심으로 동작하며, XML 데이터를 한줄씩 읽어들입니다. 다음은 SAX를 사용하여 XML을 파싱하는 예제입니다.

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;

public class SaxParserDemo {

    public static void main(String[] args) {

        try {
            File inputFile = new File("input.xml");
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();

            DefaultHandler handler = new DefaultHandler() {
                boolean bfname = false;

                public void startElement(String uri, String localName, 
                    String qName, Attributes attributes) throws SAXException {
                    if (qName.equalsIgnoreCase("firstname")) {
                        bfname = true;
                    }
                }

                public void characters(char ch[], int start, int length) 
                    throws SAXException {
                    if (bfname) {
                        System.out.println("First Name: " + new String(ch, start, length));
                        bfname = false;
                    }
                }
            };

            saxParser.parse(inputFile, handler);

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

}

위의 예제에서는 “input.xml” 파일에서 “firstname” 요소를 필터링하여 해당 요소의 내용을 출력하고 있습니다. XML 파일에서 다른 요소를 필터링하려면 위의 코드를 필요에 맞게 수정하면 됩니다.

결론

이처럼 Java를 사용하여 XML 파일에서 특정 요소를 필터링하는 것은 DOM 또는 SAX를 사용하여 XML을 파싱하고, 필요한 요소를 선택하는 방식으로 수행됩니다. 위의 예제를 참고하여 XML 파싱과 필터링을 통해 원하는 데이터를 추출할 수 있습니다.

참고 자료