자바에서 XML 데이터 읽기


보통 데이터를 교환하기 위한 여러 형식의 값들이 존재한다. 대표적으로 xml 혹은 json 의 형식이 있다. 이번 게시글에 xml 데이터를 읽는 방법에 대해서 일부 알아보려고 한다. 우선 xml 데이터가 무엇인지 알아보자.


XML (Extensible Markup Language

마크업 언어를 정의하기 위한 언어이며 확장이 가능한 언어이다. 웹 상에서 구조화된 문서를 전송 가능하도록 설계된 표준화된 텍스트 형식의 마크업 언어이다. 서로 다른 포맷 간의 데이터 통합 및 전송 문제를 해결하기 위한 방안 중 하나가 XML 인 것이다.


XML 은 어떠한 데이터를 설명하기 위해 이름을 임의로 지은 태그로 데이터를 감싼다.


참고링크


xml 데이터는 보통 공공데이터에서 내려받는 형식에서 쓰이는데, 나는 내가 만든 형식으로 xml 데이터를 만들고 그에 따라 필요한 부분을 읽는 형태로 재구성하였다.


XML 데이터

<?xml version="1.0" encoding="UTF-8"?>


<data>

<animals>

<item>호랑이</item>

<item>사자</item>

<item>오랑우탄</item>

<item>침팬지</item>

<item>고라니</item>

<item>코알라</item>

<item>캥거루</item>

</animals>

<number>

<item>1</item>

<item>2</item>

<item>3</item>

<item>4</item>

<item>5</item>

<item>6</item>

<item>7</item>

<item>8</item>

</number>

<fruit>

<item>사과</item>

<item>바나나</item>

<item>딸기</item>

<item>오렌지</item>

<item>참외</item>

<item>복숭아</item>

<item>포도</item>

<item>망고</item>

</fruit>

</data>


위와 같이 <data> 하위에 <animals>, <number>, <fruit> 를 두고 각각의 하위에는 <item> 을 두어서 상위 태그에 소속시켰다. 여기서 내가 하고 싶은 부분은 아래와 같다.

  1. <animals> 의 하위 아이템들을 배열 형태로 가져오기
  2. <number> 의 하위 아이템들을 배열 형태로 가져오기
  3. <fruit> 의 하위 아이템들을 배열 형태로 가져오기
그리고 코드는 아래와 같이 구성할 수 있었다.

구현코드
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package blog;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
 
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
 
public class XmlReader {
    
    private static final String NUMBER = "number";
    private static final String FRUIT = "fruit";
    private static final String ANIMALS = "animals";
    
    public static void main(String[]args) {
        
        File file = new File("config/data.xml");
        
        ArrayList<String> resultList = settingPattern(file, ANIMALS);
        
        for(String item : resultList) {
            System.out.println("--> " + item);
        }
        
    }
    
    private static ArrayList<String> settingPattern(File file, String name){
        
        ArrayList<String> resultList = new ArrayList<String>();
        
        try{
            
            XMLInputFactory inputFactory = XMLInputFactory.newInstance();
            InputStream inputStream = new FileInputStream(file);
            XMLEventReader eventReader = inputFactory.createXMLEventReader(inputStream);
            
            boolean isSearch = false;
            
            while(eventReader.hasNext()){
                
                XMLEvent event = eventReader.nextEvent();
                
                /** 종료태그 **/
                if(event.isEndElement()){
                    EndElement endElement = event.asEndElement();
                    String tagName = endElement.getName().getLocalPart();
                    
                    if(name.equals(tagName)){
                        isSearch = false;
                        break;
                    }
                }// if
                
                /** 필요패턴 **/
                if(isSearch){
                    
                    // 문자여부
                    if(!event.isCharacters()){
                        continue;
                    }
                    
                    Characters characters = event.asCharacters();
                    
                    // 공백
                    if(characters.isWhiteSpace()){
                        continue;
                    }
                    
                    // 추가
                    resultList.add(characters.getData());
                    
                    continue;
                }
                
                /** 시작태그 **/
                if(event.isStartElement()){
                    StartElement startElement = event.asStartElement();
                    String tagName = startElement.getName().getLocalPart();
                    
                    if(name.equals(tagName)){
                        isSearch = true;
                    }
                }
            }// while
            
        }
        catch(Exception e){
            System.err.println(e.getMessage());
            System.exit(1);
        }
        
        return resultList;
    }
}
 
cs


위와 같이 구성한다면 실제로 내가 넣는 파라미터 name 값에 따라서 필요한 내용을 값을 ArrayList 형태로 획득할 수 있다. 그리고 그 값을 콘솔에 출력하면 올바르게 나타남을 확인 가능하다.



Posted by doubler
,