반응형
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이 더 사용하기 편한 거 같다.
반응형