백엔드 Back-end/노드 Node.js

Node.js fast-xml-parser 모듈 테스트, XML을 JSON으로 바꾸기

Tap to restart 2020. 10. 23. 21:00
반응형

fast-xml-parser

npm 페이지 주소: www.npmjs.com/package/fast-xml-parser

 

 

테스트 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>

 

코드

var 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>";

var parser = require('fast-xml-parser');
var he = require('he');

var options = {
    attributeNamePrefix : "@_",
    attrNodeName: "attr", //default is 'false'
    textNodeName : "#text",
    ignoreAttributes : true,
    ignoreNameSpace : false,
    allowBooleanAttributes : false,
    parseNodeValue : true,
    parseAttributeValue : false,
    trimValues: true,
    cdataTagName: "__cdata", //default is 'false'
    cdataPositionChar: "\\c",
    parseTrueNumberOnly: false,
    arrayMode: false, //"strict"
    attrValueProcessor: (val, attrName) => he.decode(val, {isAttributeValue: true}),//default is a=>a
    tagValueProcessor : (val, tagName) => he.decode(val), //default is a=>a
    stopNodes: ["parse-me-as-string"]
};

if( parser.validate(xml) === true) { //optional (it'll return an object in case it's not valid)
    var jsonObj = parser.parse(xml,options);
    console.log("resultCode:", jsonObj.response.header.resultCode);

    var json = JSON.stringify(jsonObj);
    console.log(json);
}

 

결과

resultCode: 0
{"response":{"header":{"resultCode":0,"resultMsg":"NORMAL SERVICE."},"body":{"items":{"item":[{"거래금액":"27,500","건축년도":1992,"년":2006,"도로명":"분당로","도로명건물본번호코드":212,"도로명건물부번호코드":0,"도로명시군구코드":41135,"도로명일련번호코드":1,"도로명지상지하코드":0,"도로명코드":3180026,"법정동":"분당동","법정동본번코드":35,"법정동부번코드":0,"법정동시군구코드":41135,"법정동읍면동코드":10100,"법정동지번코드":1,"아파트":"샛별마을(동성)","월":5,"일":1,"일련번호":"41135-18","전용면적":59.4,"지번":35,"지역코드":41135,"층":8},{"거래금액":"44,000","건축년도":1993,"년":2006,"도로명":"장안로41번길","도로명건물본번호코드":13,"도로명건물부번호코드":0,"도로명시군구코드":41135,"도로명일련번호코드":1,"도로명지상지하코드":0,"도로명코드":4340380,"법정동":"분당동","법정동본번코드":66,"법정동부번코드":0,"법정동시군구코드":41135,"법정동읍면동코드":10100,"법정동지번코드":1,"아파트":"장안타운(건영)","월":5,"일":1,"일련번호":"41135-32","전용면적":131.55,"지번":66,"지역코드":41135,"층":4}]},"numOfRows":2,"pageNo":1,"totalCount":495}}}

 

JSON만 보기 좋게하면 아래와 같다.

숫자는 숫자로 인식되고, 문자는 문자로 되어서 좋은 거 같다.

{
  "response": {
    "header": {
      "resultCode": 0,
      "resultMsg": "NORMAL SERVICE."
    },
    "body": {
      "items": {
        "item": [
          {
            "거래금액": "27,500",
            "건축년도": 1992,
            "년": 2006,
            "도로명": "분당로",
            "도로명건물본번호코드": 212,
            "도로명건물부번호코드": 0,
            "도로명시군구코드": 41135,
            "도로명일련번호코드": 1,
            "도로명지상지하코드": 0,
            "도로명코드": 3180026,
            "법정동": "분당동",
            "법정동본번코드": 35,
            "법정동부번코드": 0,
            "법정동시군구코드": 41135,
            "법정동읍면동코드": 10100,
            "법정동지번코드": 1,
            "아파트": "샛별마을(동성)",
            "월": 5,
            "일": 1,
            "일련번호": "41135-18",
            "전용면적": 59.4,
            "지번": 35,
            "지역코드": 41135,
            "층": 8
          },
          {
            "거래금액": "44,000",
            "건축년도": 1993,
            "년": 2006,
            "도로명": "장안로41번길",
            "도로명건물본번호코드": 13,
            "도로명건물부번호코드": 0,
            "도로명시군구코드": 41135,
            "도로명일련번호코드": 1,
            "도로명지상지하코드": 0,
            "도로명코드": 4340380,
            "법정동": "분당동",
            "법정동본번코드": 66,
            "법정동부번코드": 0,
            "법정동시군구코드": 41135,
            "법정동읍면동코드": 10100,
            "법정동지번코드": 1,
            "아파트": "장안타운(건영)",
            "월": 5,
            "일": 1,
            "일련번호": "41135-32",
            "전용면적": 131.55,
            "지번": 66,
            "지역코드": 41135,
            "층": 4
          }
        ]
      },
      "numOfRows": 2,
      "pageNo": 1,
      "totalCount": 495
    }
  }
}

 

xml2js 모듈보다 이 fast-xml-parser이 더 사용하기 편한 거 같다.

반응형