본문 바로가기
Back-end/JAVA & Spring

자바 XML 처리 - DOM 파서(1) XML 읽기

by 꼬바리 2021. 6. 22.


XML은 플랫폼과 프로그램으로부터 독립적이며 개방된 표준으로 인간과 기계 모두 처리할 수 있는 마크업 언어입니다.

여기서 잠깐!

마크업(markup) 언어: 태그 등을 이용하여 문서나 데이터의 구조를 명기하는 언어의 한 가지

XML을 처리할 때는 XML 파서를 사용합니다.

XML 파서에는 몇 가지 종류가 있습니다.

각각의 처리 방식의 특징을 이해하고 용도에 맞는 최적의 처리 방법을 선택해야 합니다.

먼저 DOM(Document Object Model) 파서를 알아봅시다.


DOM 파서란?

DOM 파서는 XML을 파싱 하여 메모리 상에 XML 구조에 대응하는 객체의 트리를 유지합니다.

자바에서는 DOM 트리를 찾아 임의의 노드에 접근하는 것을 XPath로 검색합니다.

또한, DOM은 참조뿐만 아니라 XML에 내보내기도 지원하고 있으며, DOM 트리에 대한 변경 사항을 추가하여 XML로 출력할 수 있습니다.

트리로 구성되어 있기 때문에 구조를 파악하기 쉬운 방식이지만, 읽는 XML 크기가 클 때는 트리도 커지기 때문에 메모리를 대량으로 소비한다는 단점이 있습니다.


 

DOM 파서로 XML 읽기

DOM 트리를 구성하는 각 노드에 대응하는 인터페이스는 org.w3c.dom.Node 인터페이스를 상속합니다.

Node 인터페이스의 getNodeType() 메서드에서 해당 노드 종류를 판정할 수 있습니다.

노드 종류에는 대표적으로 요소(Element), 텍스트(Text)가 있습니다.

한 가지 더 중요한 인터페이스로 org.w3c.dom.NodeList 인터페이스가 있습니다.

Node 인터페이스의 getChildNodes() 메서드로 자식 노드 목록을 NodeList 객체로 얻을 수 있습니다.

위의 XML 파일을 DOM을 사용하여 읽어봅시다.

 

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DOMParser {
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException{
		// XML 문서 파싱
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder documentBuilder = factory.newDocumentBuilder();
		Document document = documentBuilder.parse("sample.xml");
		
		// root 구하기
		Element root = document.getDocumentElement();
		
		// root의 속성
		System.out.println("class name: " + root.getAttribute("name"));
		
		NodeList childeren = root.getChildNodes(); // 자식 노드 목록 get
		for(int i = 0; i < childeren.getLength(); i++){
			Node node = childeren.item(i);
			if(node.getNodeType() == Node.ELEMENT_NODE){ // 해당 노드의 종류 판정(Element일 때)
				Element ele = (Element)node;
				String nodeName = ele.getNodeName();
				System.out.println("node name: " + nodeName);
				if(nodeName.equals("teacher")){
					System.out.println("node attribute: " + ele.getAttribute("name"));
				}
				else if(nodeName.equals("student")){
					// 이름이 student인 노드는 자식노드가 더 존재함
					NodeList childeren2 = ele.getChildNodes();
					for(int a = 0; a < childeren2.getLength(); a++){
						Node node2 = childeren2.item(a);
						if(node2.getNodeType() == Node.ELEMENT_NODE){
							Element ele2 = (Element)node2;
							String nodeName2 = ele2.getNodeName();
							System.out.println("node name2: " + nodeName2);
							System.out.println("node attribute2: " + ele2.getAttribute("num"));
						}
					}
				}
			}
		}
	}
}

- 추가 내용

String xml = ~;

InputSource is = new InputSource(new StringReader(xml));
documentBuilder = factory.newDocumentBuilder();
document = documentBuilder.parse(is);

<name>abc</name>일 때 'abc' 읽어오기

Node node = childeren.item(a);
if(node.getNodeType() == Node.ELEMENT_NODE){
   Element ele = (Element)node;
   System.out.println(ele.getTextContent());
}

 

출처 : https://m.blog.naver.com/qbxlvnf11/221324667993

728x90
반응형

댓글