nodejs에서 XML to JSON 파싱하기


안녕하세요. 남산돈가스입니다.

오늘은 node js 에서 xml 데이터 파싱하여 json형태로 변환시켜주는 모듈을 소개해보려고 합니다.

node js를 이용하여 API 서버를 구성한다고 하면 기본적으로 핸들링하는 데이터 형태는 거의 대부분 JSON을 사용하고 있습니다.

하지만, 예를 들어 국내 공공데이터포털에서 OPEN API를 제공받으려고 하면 제공하는 데이터타입이 아직 XML 형식이 남아있는 것을 가끔 보실 수 있을 것입니다. 최근 들어, type으로 구분지어, xml 형식, json 형식을 제공하는 API도 생겼지만, 아직도 xml형식만 지원하는 API들이 남아있습니다.

이런 데이터들을 제공받아 가공하기 위해 xml to json 모듈이 필요하기 마련입니다.

제가 오늘 소개해드리는 모듈은 xml 데이터를 손 쉽게 json 으로 파싱할 수 있는 'xml-js' 모듈입니다.

예제로, 실제 공공데이터포털에서 제공하는 유실동물 검색 OPEN API 서비스를 이용하여 xml데이터를 요청한 뒤, 결과값으로 받은 xml데이터를 json으로 변환해보겠습니다.

가장 먼저 예제를 진행하기 위해서 필요한 모듈인 xml-js와 API를 request하기 위한 request 모듈 두가지를 설치해보겠습니다.

npm install xml-js request

xml-js과 request 모듈을 다운받았으면, 예제 소스를 확인해보면서 설명드리겠습니다.

예제 소스는 다음과 같습니다.

const convert = require('xml-js');
const request = require('request');


const HOST = 'http://openapi.animal.go.kr/openapi/service/rest'
const SERVICE_KEY = 'mySecretKey'

var requestUrl = `${HOST}/abandonmentPublicSrvc/sigungu?upr_cd=6500000&ServiceKey=${SERVICE_KEY}`

request.get(requestUrl, (err,res,body) =>{
    if(err){
        console.log(`err => ${err}`)
    }
    else {
        if(res.statusCode == 200){
            var result = body
            console.log(`body data => ${result}`)
            var xmlToJson = convert.xml2json(result, {compact: true, spaces: 4});
            console.log(`xml to json => ${xmlToJson}`)

        }

    }
})



먼저 최상단에 아까 설치한 xml-js와 request 모듈을 각각 convert, request라는 변수에 require 해줍니다.

그리고 공공데이터인 유실동물 검색 API를 요청하기 위한 정보로 HOST, SERVICE_KEY(API키) 를 가지고 실제 http통신할 requestUrl를 만듭니다.

그 다음으론, request 모듈을 이용해 request.get() 메서드에 위에서 생성한 requestUrl을 파라미터로 넘기게 되면 그에 따른 callback으로 err(에러), res(응답데이터), body(응답결과) 세가지를 반환합니다.

예제 소스를 보시면, request를 통해 API를 요청했고, 그에 따른 결과값에서 200(정상코드)가 확인되면, body(응답결과) 를 result라는 변수에 할당한다고 작성되어 있습니다.

여기까지 result값에 응답결과가 저장이 되었고 console.log로 로그를 출력해보면

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
    <header>
        <resultCode>00</resultCode>
        <resultMsg>NORMAL SERVICE.</resultMsg>
    </header>
    <body>
        <items>
            <item>
                <orgCd>6520000</orgCd>
                <orgdownNm>서귀포시</orgdownNm>
                <uprCd>6500000</uprCd>
            </item>
            <item>
                <orgCd>6510000</orgCd>
                <orgdownNm>제주시</orgdownNm>
                <uprCd>6500000</uprCd>
            </item>
            <item>
                <orgCd>6500000</orgCd>
                <orgdownNm>제주특별자치도</orgdownNm>
                <uprCd>6500000</uprCd>
            </item>
        </items>
    </body>
</response>

위와 같이 xml형식의 데이터가 출력되는 것을 확인하실 수 있습니다.

그럼 여기까지, request를 통해 API를 호출하여 xml데이터까지 가져와봤습니다. 이제 진짜 목적인, 이 xml데이터를 json으로 파싱하는 방법을 설명드리겠습니다.

다시 위 예제 소스에서 xmlToJson이라는 변수를 만들고 해당 변수에 convert.xml2json( result, {compact:true, spaces:4}) 라는 xml-js 모듈 메서드를 이용하면 모든 게 끝났습니다.

간단하게 저 메서드를 설명드리면, convert는 위에서 import한 xml-js모듈입니다.

convert에서 xml2json이라는 메서드를 이용해 xml -> json으로 데이터를 파싱했고, 그에 따른 파라미터로 현재 xml 데이터 형식인 result변수를, 그 다음 파라미터로 옵션값인 compact(데이터 간소화 여부), spaces(들여쓰기 포인트) 를 이용하여 파싱을 하는 원리입니다.

이렇게 convert.xml2json을 이용한 결과를 확인해보면,


{
    "_declaration": {
        "_attributes": {
            "version": "1.0",
            "encoding": "UTF-8",
            "standalone": "yes"
        }
    },
    "response": {
        "header": {
            "resultCode": {
                "_text": "00"
            },
            "resultMsg": {
                "_text": "NORMAL SERVICE."
            }
        },
        "body": {
            "items": {
                "item": [
                    {
                        "orgCd": {
                            "_text": "6520000"
                        },
                        "orgdownNm": {
                            "_text": "서귀포시"
                        },
                        "uprCd": {
                            "_text": "6500000"
                        }
                    },
                    {
                        "orgCd": {
                            "_text": "6510000"
                        },
                        "orgdownNm": {
                            "_text": "제주시"
                        },
                        "uprCd": {
                            "_text": "6500000"
                        }
                    },
                    {
                        "orgCd": {
                            "_text": "6500000"
                        },
                        "orgdownNm": {
                            "_text": "제주특별자치도"
                        },
                        "uprCd": {
                            "_text": "6500000"
                        }
                    }
                ]
            }
        }
    }
}



소스 코드 한줄로, xml 데이터를 손 쉽게 json 형태로 변환되었습니다.

npm 모듈 하나로, 개발하면서 난감할 수 있는 문제들을 쉽게 해결할 수 있다는 것이 npm 모듈의 가장 큰 장점이 아닌가 싶습니다.

감사합니다.

댓글

  1. [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate's altnames: Host: openapi.molit.go.kr
    위와같은 에러가 뜨는데 도와주실 수 있으신가요???
    올려주신 코드에 제가 보고자하는 데이터 url만 넣어서 노드로 돌렸습니다.

    답글삭제

댓글 쓰기

주간 인기글

[앱 디자인] 디자인 가이드 만들기 - 안드로이드

남산 케이블카 이야기

[AWS] Bastion Host 를 활용한 SSH 접근통제 #1

[정보] 인스타그램은 당신의 소리를 '듣고' 있을 수도 있습니다

AWS Beanstalk 구성파일(.ebextensions)을 사용하여 환경 구성하기