xml2js
npm 페이지 주소: www.npmjs.com/package/xml2js
XML을 JSON으로
JSON을 XML로 바꿔준다.
테스트 XML
국토교통부 아파트매매 실거래자료 XML 예
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
<header>
<resultCode>00</resultCode>
<resultMsg>NORMAL SERVICE.</resultMsg>
</header>
<body>
<items>
<item><거래금액> 27,500
</거래금액><건축년도>1992
</건축년도><년>2006
</년><도로명>분당로
</도로명><도로명건물본번호코드>00212
</도로명건물본번호코드><도로명건물부번호코드>00000
</도로명건물부번호코드><도로명시군구코드>41135
</도로명시군구코드><도로명일련번호코드>01
</도로명일련번호코드><도로명지상지하코드>0
</도로명지상지하코드><도로명코드>3180026
</도로명코드><법정동> 분당동
</법정동><법정동본번코드>0035
</법정동본번코드><법정동부번코드>0000
</법정동부번코드><법정동시군구코드>41135
</법정동시군구코드><법정동읍면동코드>10100
</법정동읍면동코드><법정동지번코드>1
</법정동지번코드><아파트>샛별마을(동성)
</아파트><월>5
</월><일>1
</일><일련번호>41135-18
</일련번호><전용면적>59.4
</전용면적><지번>35
</지번><지역코드>41135
</지역코드><층>8
</층>
</item>
<item><거래금액> 44,000
</거래금액><건축년도>1993
</건축년도><년>2006
</년><도로명>장안로41번길
</도로명><도로명건물본번호코드>00013
</도로명건물본번호코드><도로명건물부번호코드>00000
</도로명건물부번호코드><도로명시군구코드>41135
</도로명시군구코드><도로명일련번호코드>01
</도로명일련번호코드><도로명지상지하코드>0
</도로명지상지하코드><도로명코드>4340380
</도로명코드><법정동> 분당동
</법정동><법정동본번코드>0066
</법정동본번코드><법정동부번코드>0000
</법정동부번코드><법정동시군구코드>41135
</법정동시군구코드><법정동읍면동코드>10100
</법정동읍면동코드><법정동지번코드>1
</법정동지번코드><아파트>장안타운(건영)
</아파트><월>5
</월><일>1
</일><일련번호>41135-32
</일련번호><전용면적>131.55
</전용면적><지번>66
</지번><지역코드>41135
</지역코드><층>4
</층>
</item>
</items>
<numOfRows>2</numOfRows>
<pageNo>1</pageNo>
<totalCount>495</totalCount>
</body>
</response>
코드
const xml =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<response>\n" +
"<header>\n" +
"<resultCode>00</resultCode>\n" +
"<resultMsg>NORMAL SERVICE.</resultMsg>\n" +
"</header>\n" +
"<body>\n" +
"<items>\n" +
"<item><거래금액> 27,500\n" +
"</거래금액><건축년도>1992\n" +
"</건축년도><년>2006\n" +
"</년><도로명>분당로\n" +
"</도로명><도로명건물본번호코드>00212\n" +
"</도로명건물본번호코드><도로명건물부번호코드>00000\n" +
"</도로명건물부번호코드><도로명시군구코드>41135\n" +
"</도로명시군구코드><도로명일련번호코드>01\n" +
"</도로명일련번호코드><도로명지상지하코드>0\n" +
"</도로명지상지하코드><도로명코드>3180026\n" +
"</도로명코드><법정동> 분당동\n" +
"</법정동><법정동본번코드>0035\n" +
"</법정동본번코드><법정동부번코드>0000\n" +
"</법정동부번코드><법정동시군구코드>41135\n" +
"</법정동시군구코드><법정동읍면동코드>10100\n" +
"</법정동읍면동코드><법정동지번코드>1\n" +
"</법정동지번코드><아파트>샛별마을(동성)\n" +
"</아파트><월>5\n" +
"</월><일>1\n" +
"</일><일련번호>41135-18\n" +
"</일련번호><전용면적>59.4\n" +
"</전용면적><지번>35\n" +
"</지번><지역코드>41135\n" +
"</지역코드><층>8\n" +
"</층>\n" +
"</item>\n" +
"<item><거래금액> 44,000\n" +
"</거래금액><건축년도>1993\n" +
"</건축년도><년>2006\n" +
"</년><도로명>장안로41번길\n" +
"</도로명><도로명건물본번호코드>00013\n" +
"</도로명건물본번호코드><도로명건물부번호코드>00000\n" +
"</도로명건물부번호코드><도로명시군구코드>41135\n" +
"</도로명시군구코드><도로명일련번호코드>01\n" +
"</도로명일련번호코드><도로명지상지하코드>0\n" +
"</도로명지상지하코드><도로명코드>4340380\n" +
"</도로명코드><법정동> 분당동\n" +
"</법정동><법정동본번코드>0066\n" +
"</법정동본번코드><법정동부번코드>0000\n" +
"</법정동부번코드><법정동시군구코드>41135\n" +
"</법정동시군구코드><법정동읍면동코드>10100\n" +
"</법정동읍면동코드><법정동지번코드>1\n" +
"</법정동지번코드><아파트>장안타운(건영)\n" +
"</아파트><월>5\n" +
"</월><일>1\n" +
"</일><일련번호>41135-32\n" +
"</일련번호><전용면적>131.55\n" +
"</전용면적><지번>66\n" +
"</지번><지역코드>41135\n" +
"</지역코드><층>4\n" +
"</층>\n" +
"</item>\n" +
"</items>\n" +
"<numOfRows>2</numOfRows>\n" +
"<pageNo>1</pageNo>\n" +
"<totalCount>495</totalCount>\n" +
"</body>\n" +
"</response>";
const xml2js = require('xml2js');
const parser = new xml2js.Parser(/* options */);
parser.parseStringPromise(xml).then(function (result) {
console.log("resultCode:", result.response.header[0].resultCode[0]);
const json = JSON.stringify(result);
console.log(json);
}).catch(function (err) {
});
결과
resultCode: 00
{"response":{"header":[{"resultCode":["00"],"resultMsg":["NORMAL SERVICE."]}],"body":[{"items":[{"item":[{"거래금액":[" 27,500\n"],"건축년도":["1992\n"],"년":["2006\n"],"도로명":["분당로\n"],"도로명건물본번호코드":["00212\n"],"도로명건물부번호코드":["00000\n"],"도로명시군구코드":["41135\n"],"도로명일련번호코드":["01\n"],"도로명지상지하코드":["0\n"],"도로명코드":["3180026\n"],"법정동":[" 분당동\n"],"법정동본번코드":["0035\n"],"법정동부번코드":["0000\n"],"법정동시군구코드":["41135\n"],"법정동읍면동코드":["10100\n"],"법정동지번코드":["1\n"],"아파트":["샛별마을(동성)\n"],"월":["5\n"],"일":["1\n"],"일련번호":["41135-18\n"],"전용면적":["59.4\n"],"지번":["35\n"],"지역코드":["41135\n"],"층":["8\n"]},{"거래금액":[" 44,000\n"],"건축년도":["1993\n"],"년":["2006\n"],"도로명":["장안로41번길\n"],"도로명건물본번호코드":["00013\n"],"도로명건물부번호코드":["00000\n"],"도로명시군구코드":["41135\n"],"도로명일련번호코드":["01\n"],"도로명지상지하코드":["0\n"],"도로명코드":["4340380\n"],"법정동":[" 분당동\n"],"법정동본번코드":["0066\n"],"법정동부번코드":["0000\n"],"법정동시군구코드":["41135\n"],"법정동읍면동코드":["10100\n"],"법정동지번코드":["1\n"],"아파트":["장안타운(건영)\n"],"월":["5\n"],"일":["1\n"],"일련번호":["41135-32\n"],"전용면적":["131.55\n"],"지번":["66\n"],"지역코드":["41135\n"],"층":["4\n"]}]}],"numOfRows":["2"],"pageNo":["1"],"totalCount":["495"]}]}}
결과 중 JSON 부분만 보기 좋게 보면 아래와 같다.
별다른 옵션을 지정하지 않을 경우 아래 예처럼 데이터 대부분이 배열로 처리된다.
<resultCode>00</resultCode>도
"resultCode": ["00"]로 처리된다.
이 부분이 좀 불편했다.
{
"response": {
"header": [
{
"resultCode": [
"00"
],
"resultMsg": [
"NORMAL SERVICE."
]
}
],
"body": [
{
"items": [
{
"item": [
{
"거래금액": [
" 27,500\n"
],
"건축년도": [
"1992\n"
],
"년": [
"2006\n"
],
"도로명": [
"분당로\n"
],
"도로명건물본번호코드": [
"00212\n"
],
"도로명건물부번호코드": [
"00000\n"
],
"도로명시군구코드": [
"41135\n"
],
"도로명일련번호코드": [
"01\n"
],
"도로명지상지하코드": [
"0\n"
],
"도로명코드": [
"3180026\n"
],
"법정동": [
" 분당동\n"
],
"법정동본번코드": [
"0035\n"
],
"법정동부번코드": [
"0000\n"
],
"법정동시군구코드": [
"41135\n"
],
"법정동읍면동코드": [
"10100\n"
],
"법정동지번코드": [
"1\n"
],
"아파트": [
"샛별마을(동성)\n"
],
"월": [
"5\n"
],
"일": [
"1\n"
],
"일련번호": [
"41135-18\n"
],
"전용면적": [
"59.4\n"
],
"지번": [
"35\n"
],
"지역코드": [
"41135\n"
],
"층": [
"8\n"
]
},
{
"거래금액": [
" 44,000\n"
],
"건축년도": [
"1993\n"
],
"년": [
"2006\n"
],
"도로명": [
"장안로41번길\n"
],
"도로명건물본번호코드": [
"00013\n"
],
"도로명건물부번호코드": [
"00000\n"
],
"도로명시군구코드": [
"41135\n"
],
"도로명일련번호코드": [
"01\n"
],
"도로명지상지하코드": [
"0\n"
],
"도로명코드": [
"4340380\n"
],
"법정동": [
" 분당동\n"
],
"법정동본번코드": [
"0066\n"
],
"법정동부번코드": [
"0000\n"
],
"법정동시군구코드": [
"41135\n"
],
"법정동읍면동코드": [
"10100\n"
],
"법정동지번코드": [
"1\n"
],
"아파트": [
"장안타운(건영)\n"
],
"월": [
"5\n"
],
"일": [
"1\n"
],
"일련번호": [
"41135-32\n"
],
"전용면적": [
"131.55\n"
],
"지번": [
"66\n"
],
"지역코드": [
"41135\n"
],
"층": [
"4\n"
]
}
]
}
],
"numOfRows": [
"2"
],
"pageNo": [
"1"
],
"totalCount": [
"495"
]
}
]
}
}