9
5

More than 1 year has passed since last update.

素のJavaScriptでローカルのXMLを読み込んで、新規のXMLを書き出す話

Posted at

大本はRide with GPSからダウンロードした.gpxをGarminのOregonやeTrexで読める.gpxに変換するというお話です。

詳しい解説、実際に必要な箇所をユーザーが編集して動かせるサンプル…… そもそも何故こんなことをすることになったかの経緯はTicketnoteに書いてあります。よかったらあわせてどうぞ。
https://ticketnote.dev/ticket/DUpAHv85tU3vuFNuKE3v


Qiitaなので手短に。
HTMLとJavaScriptだけでローカルのXML(今回は.gpx)を読み込んで、読み込んだ内容から新規のXMLを書き出すというサンプルです。

See the Pen 素のJavaScriptでローカルのXMLを読み込んで、新規のXMLを書き出す by Kaitou (@kaitou1192) on CodePen.

1.ローカルのファイルの取得

const setFile = (event) => {  
  const fileObject = event.target.files[0];

  const rwgGpx = new FileReader();
  rwgGpx.addEventListener('load', (event) => loadedFile(event));
  rwgGpx.readAsText(fileObject);
}
inputFile.addEventListener('change', (event) => setFile(event));

FileReader()
https://developer.mozilla.org/ja/docs/Web/API/FileReader/FileReader

2.ファイルの中の文字列を取り出し、DOMとして扱えるように変換

  //ファイル内の文字列の取り出し
  const loadedGpx = event.target.result;

  //DOM準備
  const parser = new DOMParser();
  const temporaryGpx = parser.parseFromString(loadedGpx, 'application/xml');

DOMParser.parseFromString()
https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString

3.DOMの操作

ここでは詳しくは書きませんが、この時点で temporaryGpx.documentElement としてあげればDOMツリーとして扱えるようになり、querySelector や getElementById とかでHTMLを操作するのと同じ感覚でできます。

具体的なサンプルが見たい方は、こちらの最後の方にあるので確認してください。
https://ticketnote.dev/ticket/q1zKjfMRReQpbml4tyGy

4.DOMから文字列に変換

文字列に変換というかシリアライズしてファイルに出力する準備をしています。

  const outputGpx = new XMLSerializer();
  let outputGpxText = outputGpx.serializeToString(temporaryGpx);

XMLSerializer
https://developer.mozilla.org/ja/docs/Web/API/XMLSerializer

5.blob経由でファイルに出力

先ほどのシリアライズしたものからblobを作成し、それをwindow.URL.createObjectURL経由でユーザーにダウンロードさせます。

  const blob = new Blob([outputGpxText], {type: 'application/xml'});

  //ファイルをダウンロードさせる
  const a = document.createElement('a');
  a.href = window.URL.createObjectURL(blob);
  a.textContent = 'ダウンロード';
  a.download = 'output.gpx';

  download.appendChild(a);

Blob
https://developer.mozilla.org/ja/docs/Web/API/Blob

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5