개발/java,spring

자바 xml 데이터, 속성 파싱(java xml parsing data, attribute)

Mr.mandu. 2017. 12. 4. 15:50

안녕하세요.

오랜만에 자바관련 포스팅을 합니다.

나중에도 요긴하게 쓰일거같아 기본 코딩만 해두고 포스팅하려고 합니다.


xml 데이터 파싱을 해보겠습니다.

(java xml parsing data and attribute)


우선 테스트 xml 입니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <info> <person> <name>홍길동</name> <age>25</age> <history> <job id="1" >A</job> <job id="2" >B</job> <job id="3" >C</job> </history> </person> <person> <name>임꺽정</name> <age>22</age> </history> <job id="1" >AA</job> <job id="2" >BB</job> <job id="3" >CC</job> <history> </person> </info>



xml 구조는 테스트로 만든것이기 때문에

이해하기 쉬울 거라 생각됩니다.


제가 구현한 소스 입니다.


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 XmlExtraction {
	
	public void getXmlData(File xmlFile) throws Exception {
		 //1.문서를 읽기위한 공장을 만들어야 한다.
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        
        //2.빌더 생성
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        
        //3.생성된 빌더를 통해서 xml문서를 Document객체로 파싱해서 가져온다
		Document doc = dBuilder.parse(xmlFile);
		doc.getDocumentElement().normalize();//문서 구조 안정화
		
		Element root = doc.getDocumentElement(); 
		
		NodeList n_list = root.getElementsByTagName("person");
		Element el = null;
		NodeList sub_n_list = null; //sub_n_list
        Element sub_el = null; //sub_el
        
        Node v_txt = null;
        String value="";
        
        String[] tagList = {"name", "age", "job"};
		 
		for(int i=0; i<n_list.getLength(); i++) {
			el = (Element) n_list.item(i);
			for(int k=0; k< tagList.length; k++) {
				sub_n_list = el.getElementsByTagName(tagList[k]);
				for(int j=0; j<sub_n_list.getLength(); j++) {
					sub_el = (Element) sub_n_list.item(j);
					v_txt = sub_el.getFirstChild();
					value = v_txt.getNodeValue();
					
					System.out.println(sub_el.getNodeName() + "::::value="+value);
					if(sub_el.getAttributes().getNamedItem("id")!=null)
					System.out.println("id="+ sub_el.getAttributes().getNamedItem("id").getNodeValue() );
				}
			}

		}
	}

}

import 부분이 헷갈릴수 있어 소스 전부 첨부 하였습니다.


기본 로직은 xml을 파싱 할 수 있는 Document를 만들고

이에 태그명을 입력하여 데이터를 추출하는 과정입니다.


tagList에 선언된 부분이 제가 추출할 태그 입니다.



태그 데이터 추출


1. NodeList에 추출할 태그를 입력한다.


 - NodeList n_list = root.getElementsByTagName("person");


2. NodeList에 추출된 노드 하나의 대응하는 Element를 생성한다.


 - el = (Element) n_list.item(i);


3. 구하고자 태그의 첫번째 태그로 이동 한 뒤 값을 구한다 

(사실 태그가 없지만 프로그램에서 이렇게 인식하는듯)


 - v_txt = sub_el.getFirstChild();

 -value = v_txt.getNodeValue();


태그의 속성값 구하는 법

sub_el.getAttributes().getNamedItem("id").getNodeValue()

저는 id값을 구했으므로 getNameItem에 id를 써주었습니다.


xml 문서의 복잡도는 상당한것들이 많습니다.

그런것들은 직접 알고리즘을 구현하여 체계적인 코딩 하시기 바랍니다.


결과