[Java] XML파일과 자바(Java)로 파싱(parsing)하기

[Java] XML파일과 자바(Java)로 파싱(parsing)하기

728x90

xml예시 파일

한국이 25 서울

java로 xml파일 parsing 하기

XML 파일에서 데이터를 가져오는 절차는 HTML 파일에서 데이터를 가져오는 절차와 유사합니다.

HTML에서 데이터를 가져오거나 수정하기 위해서는 필요한 태그를 인식해줄 필요가 있습니다.

예를 들어, document.getElementById("가져올 태그의 Id") 명령어를 이용해서 특정 아이디를 가진 태그를 인식할 수 있습니다.

이처럼 xml파일 역시 태그를 인식하기 위해서 필요한 절차는 문서의 자체 객체인 document를 가져오는 것입니다.

import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; // xml 파싱 빌드업 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); // xml 파일을 document로 파싱하기 Document document = builder.parse("xml/sample.xml");

xml 파일의 위치는 원하는 상대 경로 혹은 절대 경로를 통해서 가져옵니다.

xml 파일 위치 예시

이제 자바가 xml 파일의 document를 가지고 와서 태그들을 인식할 준비가 되었습니다.

태그라는 것이 결국 document안에 있는 요소(element)이기 때문에 이 Element를 가져와야 합니다.

getDocumentElement() 메서드를 사용하면 가장 첫번째 요소(root 요소)를 가져 올 수 있습니다.

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; // root 요소 가져오기 Element root = document.getDocumentElement(); // root 요소 확인 : 첫 태그 sample System.out.println(root.getNodeName()); // root 요소의 첫번째 노드는 #Text Node firstNode = root.getFirstChild(); // 다음 노드는 customer Node customer = firstNode.getNextSibling(); // customer 요소 안의 노드 리스트 NodeList childList = customer.getChildNodes();

root요소가 태그이기 때문에 첫번째 Element인 root를 가져와서 getNodeName() 메소드를 이용해서 리턴된 문자열(String)을 출력하면 "sample"이라는 값을 얻을 수 있습니다.

getFirstChilde() 메소드를 사용하면 해당 요소의 첫 번째 있는 노드를 가져와서 리턴합니다.

이때, root라는 변수에 저장된 태그의 첫 번째 node가 태그가 아닌 #Test로 표시되는데 이는 xml파일의 빈 공백을 노드로 인식하기 때문입니다.

태그와 태그 사이의 공백을 하나의 노드로 인식하기 때문에 공백의 길이에 상관없이 하나의 노드가 됩니다.

getNextSibiling() 메서드를 이용하면 계속해서 해당 요소의 다음 노드를 리턴하게 됩니다.

첫 공백 노드에서 다음 노드인 태그 노드에 오게 되면 getChildeNodes() 메서드를 이용해서 태그 안의 노드들을 리스트로 리턴 받을 수 있습니다.

이제 customer 태그 안에 있는 태그들의 모든 데이터를 가져올 수 있습니다.

for(int i = 0; i < childList.getLength(); i++) { Node item = childList.item(i); if(item.getNodeType() == Node.ELEMENT_NODE) { // 노드의 타입이 Element일 경우(공백이 아닌 경우) System.out.println(item.getNodeName()); System.out.println(item.getTextContent()); } else { System.out.println("공백 입니다."); } }

--출력 결과--

공백입니다.

name

한국이

공백 입니다.

age

25

공백 입니다.

address

서울

공백 입니다.

가져온 요소들의 집합으로 이루어진 리스트에서. item(index) 메서드를 이용해서 각각의 요소들을 가져올 수 있습니다.

위와 마찬가지로 첫 번째 요소는 공백을 요소로 가져오고 태그, 공백을 반복하면서 리스트에 저장되어있습니다.

이제 getTextContext() 메서드를 사용하면 태그 사이의 우리가 필요로 하는 데이터를 가져올 수 있습니다.

728x90

from http://reinvestment.tistory.com/53 by ccl(A) rewrite - 2021-12-29 21:26:51