Search

반응형

'Java'에 해당되는 글 52건

  1. 2023.11.06 [JAVA] 자바에서 XML 데이터 다루는 방법. 2탄 Node와 NodeList
  2. 2023.10.14 [JAVA] 자바에서 XML 데이터 다루는 방법. 1탄
반응형

이제 XML을 불러오는 방법을 알게 되었으니 파싱을 해서 원하는 Node의 엘리멘트, 속성값 그리고 텍스트 값을 추출하는 방법을 알아보도록 하겠습니다.

 

XML 정보를 가져오는 방법은 3가지가 있다고 했습니다.

1. URL 사이트 정보를 이용하는 방법

2. XML 파일을 읽는 방법

3. String으로 만들어 사용하는 방법

 

이전 포스팅을 보면 위 3가지로 파싱하는 방법을 쉽게 알 수 있습니다.

 

2023.10.14 - [Software/Java] - [JAVA] 자바에서 XML 데이터 다루는 방법. 1탄

 

[JAVA] 자바에서 XML 데이터 다루는 방법. 1탄

안녕하세요. 신기한 연구소입니다. 최근 새로운 개발 요청을 받았답니다. 우후~ 기존 통신 방식을 변경해서 재 구축해야 하는데요. 기존 방식은 자바에서 JSON과 XML을 혼합해서 요청과 응답을 하

tiboy.tistory.com

 

이제 파일을 파싱했다면 원하는 값을 추출해서 사용하는 방법을 알아야겠지요?

아래는 샘플 xml입니다. (sample.xml로 저장하기)

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<sample id="idSample">
    <people>
        <name>홍돌이</name>
        <age>25</age>
        <address value="korea">한국</address>
    </people>
</sample>
cs

 

1. 가장 상위 element 가져오기.

 

xml의 가장 최 상위 엘리먼트를 가져오는 방법입니다.

가장 상위를 받아야 그다음 단계의 Node를 받을 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public static void main(String[] args)  throws Exception {
 
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
        DocumentBuilder builder = factory.newDocumentBuilder();        
 
        Document document = builder.parse("./src/sample.xml");
 
       Element element = document.getDocumentElement();  
 
        System.out.println(element.getAttribute("id"));
 
        System.out.println(element.getNodeName());
        
        Node firstNode = element.getFirstChild();
        
        System.out.println("1::" + firstNode.getNodeName());
   }
cs

위 예제를 실행하면 element의 속성 "id"값과 node name을 출력합니다.

idSample
sample
1::#text

마지막 출력값은 #text가 나옵니다.

Element 타입으로 element를 document를 통해 받습니다.

여기서 element는 최 상위 요소인 <sample></sample>을 의미합니다.

element.getNodeName()을 통해 받은 값이 sample임을 알 수 있습니다.

element.getAttribute("id")로 element 내 속성값을 가져올 수 있습니다.위 예제를 보면 "idSample"값을 가져왔습니다.

 

2. 첫 번째 Node 가져오기

 

14라인을 보면 Node 타입을 사용하고 있습니다. element를 시작으로 첫 번째 node를 받습니다. 바로 <people>인데요. getNodeName()를 사용해서 값을 가져왔는데 people 아닌 #text 가 출력됩니다. 그 이유는 xml 태그 사이의 공백 때문입니다. <sample>   <people>... 왼쪽을 보면 두 태그 사이에 공백이 있습니다.

공백을 없애도 되지만 Node 타입을 if문으로 비교해서 필터링할 수도 있습니다.

 

3. NodeList로 xml 정보 가져오기

 

그렇다면 첫 번째 node를 가져오고 리스트를 활용해서 xml 정보를 가져오는 소스를 이어서 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
        NodeList nList = firstNode.getNextSibling().getChildNodes();
 
        for(int i = 0; i < nList.getLength(); i++){
            Node item = nList.item(i);
            System.out.println("TYpe>>" + item.getChildNodes().getLength());
            if(item.getNodeType() == Node.ELEMENT_NODE){
                System.out.println(item.getNodeName());
                System.out.println(item.getTextContent());
                if (item.getAttributes().getLength() > 0){
                    System.out.println(item.getAttributes().getNamedItem("value").getNodeValue());
                }
             } 
        }
cs

위 소스를 보면 NodeList 타입을 가져오는데 firstNode에서 ChildNodes를  통해 NodeList 타입을 받아야 하지만 firstNode는 공백(#text)이라서 그 하위의 태그가 없습니다. 그래서 NextSibling을 통해서 다음 태그로 이동한 뒤 NodeList를 가져옵니다. 

4번 라인을 보면 for 문을 통해 nList(NodeList)의 Node 타입의 item(i)를 받습니다.

5번 라인의 의미는 해당 Node 하위에 몇 개의 Node 가 있는지 확인할 때 사용합니다.6번 라인에서 해당 Node 가 공백(#text)인 경우가 있었기에 Node.ELEMENT_NODE를 사용해서 거를 수 있습니다.7번 라인의 if 문 내부는 이제 공백이 아닌 정상적인 element의 정보를 활용할 수 있습니다.item.getNodeName() 은 현재 item의 태그명을 보여줍니다.item.getTextContent()는 현재 item에 싸여있는 <a> b </a> 이렇게 a에 싸여있는 b를 보여줍니다.이 값은 item.getFirstChild().getNodeValue() 로도 가져올 수 있습니다.

 

<address value="korea">

 

여기서 value는 address의 속성(attribute)라고 합니다.9번 라인으로 체크를 한 뒤 10번 라인으로 getNameItem("value")에 속성명을 넣고 getNodeValue()로 address의 value 속성값을 가져올 수 있습니다.

 

4. 마무리

 

이렇게 xml의 최상위 element와 속성값 받기,하위 Node와 NodeList 받아서 그 값들을 활용하는 방법에 대해 알아봤습니다.이 정도면 xml에서 값을 받고 활용하는데 충분해 보입니다.

 

다음 포스팅은 동적으로 xml과 내부 element를 생성하는 방법에 대해 알아보겠습니다.

반응형
반응형

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

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

기존 통신 방식을 변경해서 재 구축해야 하는데요. 기존 방식은 자바에서 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 를 사용하여 실제 업무에 활용한 소스를 가지고 같이 테스트해 볼 예정이오니 다음 포스팅도 기대해 주세요.궁금하거나 이해가 안 되는 내용은 댓글 주세요.

모두 즐 코딩하세요.

반응형