자바 xml 데이터, 속성 파싱(java xml parsing data, attribute) :: 개발/일상_Mr.lee

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

Posted by Mr.mandu.
2017. 12. 4. 15:50 개발/java,spring

안녕하세요.

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

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


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

(java xml parsing data and attribute)


우선 테스트 xml 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<p><?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>
 
 
</p>



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

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


제가 구현한 소스 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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 문서의 복잡도는 상당한것들이 많습니다.

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


결과