Разобрать весь XML-файл из Интернета в базу данных sqlite. - PullRequest
0 голосов
/ 15 мая 2018

Я сейчас работаю над небольшим проектом. Я хочу создать самообновляющуюся базу данных с помощью sqlite. Данные, с которыми я работаю, - это ежедневные кривые доходности казначейства (https://www.treasury.gov/resource-center/data-chart-center/interest-rates/Pages/TextView.aspx?data=yieldAll).

Прямо сейчас я пытаюсь разобрать весь XML-файл и сохранить его в базе данных sqllite?

какие-либо рекомендации?

1 Ответ

0 голосов
/ 15 мая 2018

Таким образом, есть несколько способов, которыми вы можете продолжить, есть много языков / технологий, которые вы можете использовать для этого. Node.js является одним из вариантов, он имеет хорошую поддержку для загрузки XML-данных, их анализа и записи в базу данных sqlite.

Вот пример программы (написанной на Node.js):

index.js

"use strict";

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('testData2.sqlite3');
var request = require('request');
var fs = require('fs');
var parseString = require('xml2js').parseString;

console.log('Downloading bond data..');

var options = {
    url: "http://data.treasury.gov/feed.svc/DailyTreasuryYieldCurveRateData",
    method: "get"
};

request(options, function (error, response, body) {

    if (error) {
        console.error('error:', error);
    } else {
        console.log('Response: StatusCode:', response && response.statusCode);
        console.log('Response: Body: Length: %d.', body.length);

        let xml = body;
        console.log('Parsing XML..');
        parseString(xml, {explicitArray: false, mergeAttrs: true }, function (err, result) {
            console.log('Writing bond data to database..');
            writeBondDataToDB(result.feed.entry);
        });
    }
});

function writeBondDataToDB(entries)
{
    db.serialize(function() {
      db.run("CREATE TABLE bondData (Date TEXT, BC_1YEAR TEXT, BC_5YEAR TEXT)");
    });

    db.serialize(function() {
      var stmt = db.prepare("INSERT INTO bondData VALUES (?,?,?)");
      for (var i = 0; i < 100; i++) {
          console.log('Writing entry to database for time: ',  (entries[i].content['m:properties']['d:NEW_DATE']['_']));
          var entry = entries[i].content['m:properties'];
          stmt.run(entry['d:NEW_DATE']['_'], entry['d:BC_1YEAR']['_'], entry['d:BC_5YEAR']['_']);
      }
      stmt.finalize();

    });
    db.close();
}

Эта программа загрузит и проанализирует первые 100 записей в данных о доходности облигации, это легко изменить, чтобы добавить больше. Создается столбец для даты, годичной и 5-летней доходностей.

package.json выглядит так:

package.json

{
  "name": "sqllite-bondcurve",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "request": "^2.86.0",
    "sqlite3": "^4.0.0",
    "xml2js": "^0.4.19"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

Это позволяет вам устанавливать зависимости (используя npm install).

Полученные данные выглядят так:

Date,BC_1YEAR,BC_5YEAR
1997-01-02T00:00:00,5.630000114440918,6.3000001907348633
1996-12-31T00:00:00,5.5100002288818359,6.2100000381469727
1997-01-03T00:00:00,5.5999999046325684,6.28000020980835
1997-01-07T00:00:00,5.6100001335144043,6.320000171661377
1997-01-06T00:00:00,5.6100001335144043,6.3000001907348633
1996-12-24T00:00:00,5.5100002288818359,6.130000114440918
1996-12-23T00:00:00,5.5199999809265137,6.119999885559082
1996-12-26T00:00:00,5.5,6.130000114440918
1996-12-30T00:00:00,5.46999979019165,6.0999999046325684
1996-12-27T00:00:00,5.46999979019165,6.0900001525878906

Вы также можете использовать C #, например:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Xml.Linq;

namespace DownloadBondData
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new WebClient();
            Console.WriteLine("Downloading XMl..");
            var xml = client.DownloadString("http://data.treasury.gov/feed.svc/DailyTreasuryYieldCurveRateData");
            Console.WriteLine("Parsing XMl..");
            var xmlDoc = XDocument.Parse(xml);
            var elementList = xmlDoc.Document.Elements().First().Elements().ToList();
        }
    }
}

Если у вас есть список элементов, вы можете проанализировать и записать в базу данных sqlite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...