Node.js 에서 xml 데이터 파싱하여 json 형태로 변환하기

공공데이터 포털에서 OPEN API를 제공받아 사용해보려고 하면 일반적으로 JSON, XML 형식으로 데이터를 제공한다. 하지만 모든 OPEN API에 해당하는것은 아니며 XML 형식만 제공하는 OPEN API들이 있었다.


내가 사용하고자하는 OPEN API가 XML 형식으로만 지원했고 이러한 XML 형식의 데이터들을 JSON으로 바꾸어 사용하고 싶었다.

찾아보니 xml을 json으로 변경시켜주는 xml-js 라는 라이브러리가 있었다.




$ npm install xml-js request

예제 소스코드는 아래와 같다.

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

const END_POINT = " http://apis.data.go.kr/B552584/EvCharger";
const SERVICE_KEY = "일반 인증키(Encoding)";

const requestUrl = `${END_POINT}/getChargerInfo?serviceKey=${SERVICE_KEY}&numOfRows=10&pageNo=1`;

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



일단 최상단에 설치한 xml-js와 request 모듈을 각각 convert, request라는 변수에 require 한다.


그리고 난 후 공공데이터 API를 요청하기 위한 정보로 END_POINT, SERVICE_KEY(API키) 를 가지고 실제 http통신할 requestUrl를 작성한다.


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


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


여기까지 result값에 응답결과가 저장이 되었고 console.log로 결과를 출력해보면 XML 형식의 데이터가 출력된다.



그다음으로 xmlToJson이라는 변수를 선언하고 해당 변수에 convert.xml2json( result, {compact:true, spaces:4}) 라는 xml-js 모듈 메서드를 이용하면 끝이다.



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


이렇게 convert.xml2json 이용한 결과를 확인해보면 JSON 형식으로 출력되는것을 확인할 수 있다.





xml to json => {
    "_declaration": {
        "_attributes": {
            "version": "1.0",
            "encoding": "UTF-8",
            "standalone": "yes"
        }
    },
    "response": {
        "header": {
            "resultCode": {
                "_text": "00"
            },
            "resultMsg": {
                "_text": "NORMAL SERVICE."
            },
            "totalCount": {
                "_text": "41582"
            },
            "pageNo": {
                "_text": "1"
            },
            "numOfRows": {
                "_text": "10"
            }
        },
        "body": {
            "items": {
                "item": [
                    {
                        "statNm": {
                            "_text": "종묘 공영주차장"
                        },
                        "statId": {
                            "_text": "ME000001"
                        },
                        "chgerId": {
                            "_text": "01"
                        },
                        "chgerType": {
                            "_text": "03"
                        },
                        "addr": {
                            "_text": "서울특별시 종로구 종로 157, 지하주차장 4층 하층 T구역"
                        },
                        "lat": {
                            "_text": "37.571076"
                        },
                        "lng": {
                            "_text": "126.995880"
                        },
                        "useTime": {
                            "_text": "24시간 이용가능"
                        },
                        "busiId": {
                            "_text": "ME"
                        },
                        "busiNm": {
                            "_text": "환경부"
                        },
                        "busiCall": {
                            "_text": "1661-9408"
                        },
                        "stat": {
                            "_text": "5"
                        },
                        "statUpdDt": {
                            "_text": "20210323024818"
                        },
                        "powerType": {
                            "_text": "급속(50kW)"
                        },
                        "zcode": {
                            "_text": "11"
                        },
                        "parkingFree": {
                            "_text": "Y"
                        },
                        "note": {}
                    },

          ..... 이하 생략




댓글