본문 바로가기
IT/web

Node.js] xml, rss 파싱

by 깻잎쌈 2020. 2. 18.
반응형

xml :  Extensible Markup Language

텍스트 데이터, 계층 구조 

 

xml2js

Simple XML to JavaScript object converter.

www.npmjs.com

xml -> js

// 모듈 로드
var parseString = require('xml2js').parseString;

// 테스트 용 XML 데이터
var xml = "<fruits shop='AAA'>" +
    "<item price='140'>Banana</item>" +
    "<item price='200'>Apple</item>" +
    "</fruits>";

// XML 을 전달 
parseString(xml, function (err, result) {
    // console.log(JSON.stringify(result)); // --- ( ※ 1)
    // fruits를 제공하는 가게 이름 
    var shop = result.fruits.$.shop;
    console.log("shop=" + shop);

    // furits의 이름과 가격을 표시
    var items = result.fruits.item;
    for (var i in items) {
        var item = items[i];
        console.log("-- name=" + item._);
        console.log(" price=" + item.$.price);
    }
});

// 모듈 로드
var parseString = require('xml2js').parseString;

// 테스트 용 XML 데이터
var xml =
    "<items>" +
    "<item><name>Banana</name><price>130</price></item>" +
    "<item><name>Apple</name><price>300</price></item>" +
    "<item><name>Pear</name><price>250</price></item>" +
    "</items>";

// XML 전달 
parseString(xml, function (err, r) {
    //console.log(JSON.stringify(r));
    // 각요소의 표시 
    console.log("---");
    console.log(r.items.item[0].name[0]);
    console.log(r.items.item[0].price[0]);
});


RSS : Rich Site Summary / Really Simple Syndication

XML 기반

기상예보 Rss 해석하기

http://web.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109

// 기상청 기상예보 RSS
var RSS = "http://web.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109";

// 모듈 로드
var parseString = require('xml2js').parseString;
var request = require('request');

// RSS 다운로드 ---- (※1)
request(RSS, function (err, response, body) {
    if (!err && response.statusCode == 200) {
        analyzeRSS(body);
    }
});

// RSS 해석 ---- (※2)
function analyzeRSS(xml) {
    // XML을 JS 오브젝트로 변환
    parseString(xml, function (err, obj) {
        if (err) {
            console.log(err);
            return;
        }
        // 기상 예보 정보 출력 ----- (※3)
        //console.log(JSON.stringify(obj)); // ----- (※4)
        var datas = obj.rss.channel[0].item[0].description[0].body[0].location[0].data;
        var city = obj.rss.channel[0].item[0].description[0].body[0].location[0].city;
        for (var i in datas) {
            var data = datas[i];
            console.log(city + " " + data.tmEf + " " + data.wf + " " + data.tmn + "~" + data.tmx);
        }
    });
}

 

cheerio-httpcli module

// 기상청 기상예보 RSS(cheerio이용) for Node.js

// 기상 RSS
var RSS = "http://web.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109";

// 모듈 로드
var client = require('cheerio-httpcli');

// RSS 다운로드
client.fetch(RSS, {}, function (err, $, res) {
    if (err) {
        console.log("error");
        return;
    }

    var city = $("location:nth-child(1) > city").text();

    // 필요한 항목을 추출해서 표시 ---------------------- (※1)
    $("location:nth-child(1) > data").each(function (idx) {

        var tmEf = $(this).find('tmEf').text();
        var wf = $(this).find('wf').text();
        var tmn = $(this).find('tmn').text();
        var tmx = $(this).find('tmx').text();

        console.log(city + " " + tmEf + " " + wf + " " + tmn + "~" + tmx);
    });
});

반응형

댓글