はじめに
この春から✨ピカピカ社会人✨の あなP(@annap_ms)です。
いきなりですが、XML(Extensible Markup Language)について、ファイルの設定情報やデータ構造を扱う際に、特定のタグや属性だけを取り出したい場面はよくあります。
何も知らなかった私は、正規表現を使ってタグや属性を抽出するコードを書いていましたが、ネストが深くなったり、属性があったりなかったりと、処理がだんだん面倒に……。
「いや、こんなものに専用ライブラリがないわけないよな?」とふと我に返って調べてみたところ、あっさりと便利なライブラリ fast-xml-parser
に出会いました。
ちゃんと調べようという戒めの意味も込めて、備忘録として残しておきます。
正規表現でXMLを処理していたときの話
例えば、以下のようなシンプルな構造のXMLから、user
タグの id
属性と、
その中に含まれる name
タグの中身を抽出したい場合を考えます。
<user id="001">
<name>Alice</name>
</user>
このXMLに対して、JavaScriptで正規表現を使って情報を抜き出すコードは次のようになります。
const xml = `<user id="001"><name>Alice</name></user>`;
const regex = /<user\s+id="(.*?)">.*?<name>(.*?)<\/name><\/user>/s;
const result = regex.exec(xml);
console.log(result[1]); // "001"
console.log(result[2]); // "Alice"
このように、シンプルな構造であれば正規表現でも必要な値を取得することができます。
ただし、改行や空白があったり、属性の順序が変わったり、タグの中に別の要素がネストしていたりすると、正規表現だけで正確にマッチさせるのが難しくなります。
また、タグや属性が省略されるケースでは、想定外のデータが取り出されてしまうこともあり、正規表現だけに頼る実装には限界を感じる場面もありました。
fast-xml-parser
で同じことをやってみた
fast-xml-parser
は、XML を JavaScript オブジェクトや JSON に変換できる軽量なライブラリです。 逆に、オブジェクトから XML を生成することもできます。
バリデーション機能もあり、ESM やブラウザにも対応しています。
まずはパッケージをインストールしておきます。
npm install fast-xml-parser
先ほのXMLに対して fast-xml-parser
を使って情報を抽出する場合は、次のようなコードになります。
const { XMLParser } = require("fast-xml-parser");
const xml = `<user id="001"><name>Alice</name></user>`;
const parser = new XMLParser({
ignoreAttributes: false,
attributeNamePrefix: "@_",
});
const parsed = parser.parse(xml);
console.log(parsed.user["@_id"]); // "001"
console.log(parsed.user.name); // "Alice"
このように、parse
メソッドを使えば XML 全体をオブジェクトに変換できます。
属性も含めてパースしたい場合は、ignoreAttributes: false
を指定する必要があります。
この設定により、属性は @_
というプレフィックス付きでアクセスできるようになり、
タグのネスト構造もそのままオブジェクトとして扱うことができます。
正規表現では、タグや属性の存在・順序を細かく気にしながら処理を組み立てる必要がありましたが、fast-xml-parser
を使えば、そのような細かい制御を意識せずに、シンプルに値を取り出すことができます。
なお、fast-xml-parser
では他にもさまざまな設定が可能で、
タグや属性の値を自動で数値や真偽値に変換する parseTagValue
や parseAttributeValue
、
空のタグの扱いを調整する suppressEmptyNode
など、用途に応じて柔軟にカスタマイズできます。
さいごに
つい「正規表現でなんとかできそう」と思ってしまいがちな? XML 処理ですが、構造が複雑になると、思った以上に扱いづらくなっていきます。
今回のように「専用のライブラリがあるのでは?」と立ち止まって調べてみるだけで、ぐっとシンプルに問題が解決できることもあります。
私と同じように、ちょっと遠回りしている方の助けになればうれしいです。