안녕하세요. 신기한 연구소입니다.
최근 새로운 개발 요청을 받았답니다. 우후~
기존 통신 방식을 변경해서 재 구축해야 하는데요. 기존 방식은 자바에서 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 를 사용하여 실제 업무에 활용한 소스를 가지고 같이 테스트해 볼 예정이오니 다음 포스팅도 기대해 주세요.궁금하거나 이해가 안 되는 내용은 댓글 주세요.
모두 즐 코딩하세요.
'Software > Java' 카테고리의 다른 글
[자바]VSCode 에서 Java Debug 하는 방법, VisualStudioCode, 자바, 디버그, 디버깅, debugging (0) | 2023.12.22 |
---|---|
[JAVA] 자바에서 XML 데이터 다루는 방법. 2탄 Node와 NodeList (0) | 2023.11.06 |
[Java]추상클래스(Abstract Class) 와 인터페이스(Interface) 쉽게 이해하기. (0) | 2021.08.15 |
변수와 객체 정리해 보기. 클래스 변수, 파라메터, 인스턴스 변수, 지역 변수, 전달 인자... (0) | 2021.08.01 |
[자바/java]파일 읽기를 위해 I/O Streams 중 Character Streams(문자열 스트림)에 대해 알아봅니다. (0) | 2021.02.21 |