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": [...]
}
}
おわりに
他に良さそうなのがあれば教えてください