見出し画像

【JavaScript】fetchで外部ドメインのXMLファイルを取得する

今回はfetchを使って、外部ドメインのXMLファイルを取得してみます。


以前の記事は↓こちら

JSONファイルの時は、fetchで読み込んでjson()でパース(解析)すれば簡単に取得できました。


なるほど!XMLファイルだから、おそらくxml()でパースすれば•••


って、できんのかい!!!汗


text()やjson()はありますが、xml()はない模様。ちょっと、つまずいたのでNoteに書こうと思った訳です。


では、気を取り直して行ってみましょう!


全体のソースコード

<!DOCTYPE HTML>
<html lang="ja">

<head>
  <title>fecthで外部ドメインのxmlファイルをスクレイピングしよう!</title>
  <meta charset="UTF-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <style>
    html,
    body {
      padding: 0;
      margin: 0;
      width: 100%;
      height: 100%;
    }

    ul {
      padding: 0;
      margin: 0;

    }

    li {
      width: 80%;
      margin: 0;
      line-height: 2em;
      padding: 0.5em;
      text-align: left;
      list-style: none;
      border-top: 1px #000 solid;
    }

    li:nth-child(even) {
      background: #f2f2f2;
    }

    li:last-child {
      border-bottom: 1px #000 solid;
    }
  </style>
  <script type="module">
    onload = async () => {

      const parser = new DOMParser();

      const res = await fetch('https://www.ezairyu.mofa.go.jp/opendata/area/newarrivalA.xml');

      const data = await res.text();

      const txt = await parser.parseFromString(data, "text/xml");

      const doc = txt.querySelectorAll("mail");

      const arr = Array.from(doc);

      for (let i = 0; i < arr.length; i++) {

        info.innerHTML += "<li><h2>" + arr[i].querySelector("title").textContent + "</h2>" + arr[i].querySelector("leaveDate").textContent + "<br>" + arr[i].querySelector("lead").textContent.replace("●", "") + "</li>";

      }

    }
  </script>
</head>

<body>
  <center>
    <h1>fecthで外部ドメインのxmlファイルをスクレイピングしよう!</h1>

    <ul>
      <div id="info"></div>
    </ul>

    出典:外務省、<a href="https://www.anzen.mofa.go.jp/">海外安全情報</a>、<a href="https://creativecommons.org/licenses/by/4.0/deed.ja">CC BY 4.0</a>
  </center>
</body>

</html>

今回は、外部ドメインのXMLファイルを読み込んで、リストで表示されるまで、やってみます!


どのデータを取得しよう?


今回は、外務省のオープンデータの「海外安全情報」を見つけましたので、取得してみました!

出典:海外安全情報オープンデータ


利用マニュアルに取得方法があったので、見てみます。

出典:海外安全情報オープンデータ、利用マニュアル


全量、通常、軽量と分けられているようです。せっかくなので、全量データを取得します。


コード解説

一旦、テキストで読み込む

const res = await fetch('https://www.ezairyu.mofa.go.jp/opendata/area/newarrivalA.xml');

const data = await res.text();

ひとまず、fetchでURLにアクセスし、テキストで読み込みます。デバッグすると、テキストで読み込まれていることが分かります。

テキストで読み込んだ状態



DOMParserを使う

const parser = new DOMParser();

const txt = await parser.parseFromString(data, "text/xml");

読み込んだdataをDOMParserでパースします。


どういう風に読み込まれているでしょうか?こちらもデバッグしてみましょう!

DOMParserでパースした結果

ちゃんとdocumentで読み込まれていることが分かります。


queryselectorAllを使う

const doc = txt.querySelectorAll("mail");

情報を見るに、重要なところは、<mail>〜</mail>の部分だと分かります。なので、queryselectorAllでここを抽出します。


<mail>〜</mail>を抽出


配列に格納する

const arr = Array.from(doc);

ここはお好みです。そのままXMLの解析に入っても良いです。僕は、配列に格納しました。


リストに表示させる

for (let i = 0; i < arr.length; i++) {

         info.innerHTML += "<li><h2>" + arr[i].querySelector("title").textContent + "</h2>" + arr[i].querySelector("leaveDate").textContent + "<br>" + arr[i].querySelector("lead").textContent.replace("●", "") + "</li>";

}

あとは、textContentなどで、必要な情報を取り出して、innerHTMLでli要素に書き込んでいきます。


ちゃんと表示されているかな?見てみましょう!

リストに表示させたところ


良いですね!問題なく、表示されています。リストは、cssを使って色々とデザインできますので、お好きなデザインにしてみてください!


DOMParserを使って、パースするところがポイントです。ぜひ、トライしてみてください!

Github

https://github.com/linkevery2s/sourcecode


参考文献

外務省、海外安全情報

Fetch API

いいなと思ったら応援しよう!