LoginSignup
3
1

More than 1 year has passed since last update.

XMLをJSONに変換できるxml2js

Posted at

とあるAPIで返ってくるレスポンスがXML形式だったため、jsonに変換したくて方法を探していたところ、
xmlをjsonに変換できる「xml2js」というモジュールがあることが分かったので、実際に使ってみました。

xml2jsをインストール

まず初めにxml2jsをインストールします。

$ npm install xml2js

そして、xml2jsをrequireでインポートします。

const xml2js = require('xml2js');

この時、Typescriptを使っていたので、エディタ上で下記のようなエラーが出ました。
ESLint: Require statement not part of import statement.(@typescript-eslint/no-var-requires)

これを回避するには、@types/xml2jsをインストールして、それをインポートします。

$ npm install --save @types/xml2js
import xml2js from 'xml2js';

これでエラー回避できました。

あとのところは下記記事を参考に実装し、問題なくXMLデータをjsonに変換することができました。

参考にさせていただいた記事:
Node.js + axios で XMLのレスポンスを扱う

難点

このxml2jsを使って一つ躓いたのが、jsonの形式です。
今回、APIを叩いて返ってくるデータが1つだったり、複数だったり様々なパターンのものでした。

[
  {
      apple: りんご,
      banana: バナナ,
      orange: みかん
  },
  {
      apple: りんご,
      banana: バナナ,
      orange: みかん
  }
]

このように、xmlからjson形式に変換した後、複数データの時は配列で返ってくるのですが、
1つのデータだった場合は、配列ではなくobjectになっていました。

{
  apple: りんご,
  banana: バナナ,
  orange: みかん
}

この後のコードで繰り返し処理(map)させたかったので、objectだとエラーになってしまいます。
xml2jsのオプションの中にexplicitArrayというものがあったので、
なんとなくこれをtrueにしてみましたが

[
  {
    apple: [りんご],
    banana: [バナナ],
    orange: [みかん]
  }
]

なんでそんなことになるん?????となったので、
面倒ですがレスポンスデータが配列の時とオブジェクトの処理の時を条件分岐させることにしました。
配列で返ってくるように選択できればいいのにな・・・

3
1
1

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
3
1