12
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

XMLを正規表現で抽出してたけど、全部fast-xml-parserでよかった件

Last updated at Posted at 2025-04-07

はじめに

この春から✨ピカピカ社会人✨の あな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 では他にもさまざまな設定が可能で、
タグや属性の値を自動で数値や真偽値に変換する parseTagValueparseAttributeValue
空のタグの扱いを調整する suppressEmptyNode など、用途に応じて柔軟にカスタマイズできます。

さいごに

つい「正規表現でなんとかできそう」と思ってしまいがちな? XML 処理ですが、構造が複雑になると、思った以上に扱いづらくなっていきます。

今回のように「専用のライブラリがあるのでは?」と立ち止まって調べてみるだけで、ぐっとシンプルに問題が解決できることもあります。

私と同じように、ちょっと遠回りしている方の助けになればうれしいです。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?