fourside.github.io

XML Parserの比較

2020/10/21 09:00:00 +00:00

  • radikoのxmlをjsonにパースしたくて、npmモジュールの比較をしてみました
  • 前提
    • ランタイムは Node.js で、ブラウザでの実行は考慮しない
    • パースの実行頻度はそれほど高くないので、実行速度は気にしない
    • コンテナに乗せる可能性はある(ファイルサイズやインストールの速度は気にする)
  • 対象はこの3つにした
  • 比較したときのコードはこれ

TL;DR

  • 悩むけど fast-xml-parser がよさそう
    • 次点で xml2js

比較の軸

  • npm trends
  • 型情報の有無
  • 使用感
  • 出力の比較

npm trends

xml2json vs fast xml parser vs xml2js | npm trends

  • xml2jsがGitHub starもダウンロード数も圧倒的に多い
  • ファイルサイズも xml2js が小さい

型情報の有無

  • fast-xml-parserは自身の型定義を提供してくれている
  • それ以外の2つは@types パッケージがある

使用感

  • xml2js
    • プロミス用のメソッドがあり、若干野暮ったい(parseStringPromise)
  • xml2json
    • インストール時にローカルビルドが走る
    • パースの結果がJSONの文字列で、JSON.parse する必要がある
  • fast-xml-parse
    • 特になし

出力の比較

  • 入力は以下のようなラジオ局一覧の xml
  • 結論、出力に関しては、オプション次第でどれも使いやすいJSONが得られる
<?xml version="1.0" encoding="UTF-8" ?>
<stations area_id="JP13" area_name="TOKYO JAPAN">
  <station>...</station>
  <station>...</station>
</stations>

xml2js

  • 属性はフラットに表現されるのではなく、オブジェクトとしてまとめて表現される
    • フィールド名はオプションで変更可能
  • テキストノードはデフォルトで配列で表現されるが、オプションで変更可能
{
  "stations": {
    "attr": {
      "area_id": "JP13",
      "area_name": "TOKYO JAPAN"
    },
    "station": [...]
  }
}

xml2json

  • 特にオプションの指定なく、分かりやすいJSONが得られた
    • ただしオプションは他の2つに比べて粗い
  • 属性はフラットに親フィールドにぶら下がる(ので、xmlの属性であったかどうかは不可逆)
{
  "stations": {
    "area_id": "JP13",
    "area_name": "TOKYO JAPAN",
    "station": [...]
  }
}

fast-xml-parser

  • デフォルトで属性を無視ってきたので驚いたが、オプションで制御可能
  • 属性はフラットに親フィールドにぶら下がる
    • ただしフィールド名にサフィックスをつけることができる(オプションで空文字を指定することもできる)
  • 下記の出力例には現れてないが、数値のノードはJSONでも数値として表現される(上記2つは "1" のように文字列になる)
{
  "stations": {
    "area_id": "JP13",
    "area_name": "TOKYO JAPAN",
    "station": [...]
  }
}

おわりに

他に良さそうなのがあれば教えてください


fourside

Written by fourside