반응형

안녕하세요. 신기한 연구소입니다.

최근 새로운 개발 요청을 받았답니다. 우후~

기존 통신 방식을 변경해서 재 구축해야 하는데요. 기존 방식은 자바에서 JSON과 XML을 혼합해서 요청과 응답을 하고 있는 구조더군요.

그런데 응답부분은 기존대로  XML을 사용해서 서비스를 제공해야 한다더군요. 흠...

응답해 줄  XML을 구성하고 JSON으로 통신해서 얻은 값을 활용해서 XML로 다시 구성한 후 응답하는 시스템인데 무슨 말인지 복잡하죠? 

우선  자바(JAVA)에서 XML을 다루는 방법을 익히고 업무에 적용하면 쉽게 진행이 될 듯합니다.

기본적인 자바(JAVA)에서  XML 파싱을 먼저 알아봅니다.

참고로 XML 데이터는 총 3가지로 받을 수 있습니다.

다른 시스템에서 응답으로 받았거나 소스 내부에서 문자열(String)로 생성한 경우,

시스템 내부 xml 파일로 존재해서 불러오는 경우,

외부 사이트에서 제공하는 xml 데이터를 URL로 불러오는 경우가 있습니다.

 

1. String 문자열로 된 XML 파싱 예제 확인하기. - 자바(JAVA) -

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
import java.io.ByteArrayInputStream;
import java.io.InputStream;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element; 
 
public class XMLSam {
    public static void main(String[] args) throws Exception {
        System.out.println("XML Parsing Sample!");
 
        String sampleXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><customer id=\"cus\"><online><name>고객1</name><age>28</age><gender></gender></online></customer>";
        InputStream is = new ByteArrayInputStream(sampleXML.getBytes("UTF-8"));
 
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder build = factory.newDocumentBuilder();
        Document doc = build.parse(is);
 
        Element element = doc.getDocumentElement();
 
        System.out.println(element.getAttribute("id"));
 
 
    }
}
cs

위 예제는 문자열로 xml을 활용하는 예제입니다. 문자열로 xml을 만들어 사용할 때는 값에 포함된 "를 반드시 \를 사용해야 합니다. 당연 오류가 나고 실행이 안될 테니까요.

DocumentBuilderFactory  를 사용해서 XML로 구성된 DOM용 파서 생성용 인스턴스인 factory를 만듭니다.

DocumentBuilder  는 XML 문서로부터 DOM 문서용 인스턴스를 얻기 위한 클래스로 factory객체를 통해 생성합니다.  이 인스턴스는 XML로부터 Document 를 얻을 수 있게 해 줍니다. 바로 19번 라인처럼요.

build 객체는 parse 메서드를 가지고 있고 인수로 XML 데이터를 받습니다. 위 예제는 문자열로 만든 XML을 인수로 받는 소스인데 String 문자열을 그대로 받을 수 없고 InputStream 타입으로 ByteArrayInputStream 생성자를 통해 인스턴스를 생성한 뒤 그 인스턴스를 넘기면 됩니다. 혹시 charset의 이슈가 있다면 getBytes("UTF-8") 처럼 원하는 charset을 지정해 주면 오류가 안 납니다.

생성된 문서 doc를 사용해서 XML의 root를 가져온 뒤 해당 root의 "id" 속성을 가져오는 테스트를 진행합니다.

성공적으로 잘 출력이 됩니다.

 

2. XML 파일로 된 XML 파싱 예제 확인하기.  - 자바(JAVA) -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
 
 
public class NomalizeTest {
    public static void main(String[] args)  throws Exception {
 
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
        DocumentBuilder builder = factory.newDocumentBuilder();        
 
        Document document = builder.parse("./src/sample.xml");
 
        Element root = document.getDocumentElement();  
 
        System.out.println(root.getAttribute("id"));
    
 
    }
    
}
cs

이번 예제는 XML 파일을 불러와서 파싱 하는 소스입니다. 첫 번째 소스와 거의 같습니다. 14번 라인의 parse의 인수로 InputStream이 아닌 파일 경로를 사용했습니다. 이 경우는 sample.xml 파일을 지정된 위치에 만들어야 합니다.

 

3. URL을 통해 XML 파싱 예제 확인하기.  - 자바(JAVA) -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
 
 
public class Test {
    
 
    public static void main(String[] args) throws Exception {
        System.out.println("START");
 
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 
        DocumentBuilder builder = factory.newDocumentBuilder();
        
        Document document = builder.parse("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108");   
 
        Element root = document.getDocumentElement();
 
        System.out.println(root.getAttribute("version"));  //root 속성값 가져오기
    }
    
}
cs

17라인을 보면 parse의 인수가 url로 되어 있습니다. 기상청 전국 날씨를 XML 형식으로 받을 수 있는 URL입니다. 샘플로 공부하기 좋습니다. 실제 데이터이기에 이 정보를 가지고 사이트 구축 시 활용해도 좋답니다.

컴파일 후 실행하면 정상적으로 결괏값이 나옵니다. version은 "2.0 " 으로 출력됩니다.

지금까지 3가지 방식의  자바(JAVA)에서 XML 데이터를 가져와 파싱 하는 예제를 만들어봤습니다.

자바(JAVA) 에서 XML 데이터의 노드 값, 속성 값, 텍스트 값을 가져오는 방식이 있는데 복잡한 XML 데이터를 잘 분석해서 프로그램으로 만드는 방법을 다음 포스팅에 설명할 예정입니다.

자바(JAVA)의 클래스/인터페이스인 NodeList, Node 를 사용하여 실제 업무에 활용한 소스를 가지고 같이 테스트해 볼 예정이오니 다음 포스팅도 기대해 주세요.궁금하거나 이해가 안 되는 내용은 댓글 주세요.

모두 즐 코딩하세요.

반응형