FlutterでXMLをJSONへ簡単変換!xml2json

現在ではREST APIの多くがJSONを採用していますが、業務システムやレガシーシステムでは、今でもXML形式のデータを扱うケースが少なくありません。

例えば、

  • RSSフィードの取得
  • SOAP APIとの連携
  • ECサイトの商品情報取得
  • 気象データの取得
  • 各種業務システムとの連携

などではXMLが利用されています。

FlutterではJSONを扱うことは簡単ですが、XMLをそのまま扱うのは少し面倒です。

そんなときに便利なのが xml2json パッケージです。

この記事では、XMLをJSONへ変換できる「xml2json」の使い方や特徴を解説します。


xml2jsonとは?

xml2jsonは、XML文字列を解析し、JSON形式へ変換できるDartライブラリです。

内部では xml パッケージを利用してXMLを解析し、用途に応じて複数の変換方式でJSONへ変換できます。現在は以下の4つの変換方式をサポートしています。

  • Parker
  • Parker(属性付き)
  • Badgerfish
  • GData
  • OpenRally

Flutterだけでなく、純粋なDartプロジェクトでも利用できます。


インストール

まずは pubspec.yaml に追加します。

dependencies:
  xml2json: ^6.2.7

続いて、

flutter pub get

を実行します。


基本的な使い方

まずはライブラリを読み込みます。

import 'package:xml2json/xml2json.dart';

XMLを読み込みます。

const xml = '''
<book>
  <title>Flutter入門</title>
  <price>2980</price>
</book>
''';

パーサーを作成します。

final transformer = Xml2Json();

transformer.parse(xml);

これでXMLを解析できます。


Parker形式へ変換

もっともシンプルな変換方法です。

final json = transformer.toParker();

print(json);

結果

{
  "title": "Flutter入門",
  "price": "2980"
}

余分な情報を含まないため、シンプルなXMLを扱う場合におすすめです。


Badgerfish形式へ変換

XMLの属性も保持したい場合はBadgerfish形式を利用します。

XML

<book id="1">
  <title>Flutter入門</title>
</book>

変換

final json =
    transformer.toBadgerfish();

結果

{
  "book": {
    "@id": "1",
    "title": {
      "$": "Flutter入門"
    }
  }
}

属性情報まで保持できるため、XMLをほぼ完全な形でJSONへ変換できます。


GData形式へ変換

Google Data APIで利用されていた形式にも対応しています。

final json =
    transformer.toGData();

Google系サービスとの連携などで利用されるケースがあります。


OpenRally形式へ変換

最新版ではOpenRally形式もサポートされています。

final json =
    transformer.toOpenRally();

用途に応じて変換方式を選択できます。


RSSフィードを解析する

RSSは代表的なXMLデータです。

例えば取得したXMLを

transformer.parse(rssXml);

final json =
    transformer.toParker();

とするだけでJSONへ変換できます。

その後は

final map =
    jsonDecode(json);

として通常のJSONと同じように扱えます。


HTTPレスポンスとの組み合わせ

例えばXML APIへアクセスした場合、

final response =
    await http.get(uri);

transformer.parse(
    response.body);

final json =
    transformer.toParker();

これだけでXMLレスポンスをJSONへ変換できます。

FlutterではJSON操作に慣れている開発者が多いため、XMLを直接扱うよりも実装しやすくなります。


jsonDecodeでMapへ変換

取得したJSON文字列は、

import 'dart:convert';

final map =
    jsonDecode(json);

print(map['title']);

のように通常のJSONとして利用できます。


変換方式の違い

方式属性保持用途
Parker×シンプルなXML
Parker(属性付き)○軽量かつ属性も必要な場合
Badgerfish○XML構造をできるだけ保持
GData○Google Data API互換
OpenRally○OpenRally形式が必要な場合

用途に応じて最適な変換方式を選択しましょう。


主な活用シーン

RSSリーダー

RSSフィードをJSONとして扱えます。

SOAP API

SOAPレスポンスを解析できます。

レガシーシステム連携

XMLベースの社内システムとの通信に利用できます。

ECサイト

商品情報XMLの解析に便利です。

気象・公共API

XML形式で提供されるオープンデータにも活用できます。


メリット

XMLを簡単にJSON化できる

数行のコードだけで変換できます。

複数の変換方式に対応

用途に応じてParkerやBadgerfishなどを選択できます。

Dart・Flutter両対応

Flutterだけでなく、サーバーサイドDartでも利用可能です。

クロスプラットフォーム対応

Android・iOS・Web・Windows・macOS・Linuxすべてで利用できます。


注意点

JSONの構造は変換方式によって異なる

ParkerとBadgerfishでは生成されるJSON構造が大きく異なります。

シンプルなXMLであればParker、属性や名前空間を保持したい場合はBadgerfishを選ぶのがおすすめです。

XMLの完全な再現が目的ではない

xml2jsonは「XMLを扱いやすいJSONへ変換する」ためのライブラリです。

変換方式によってはコメントや一部のXML固有情報は保持されない場合があります。


まとめ

xml2jsonは、FlutterやDartでXMLデータを扱う際に非常に便利なライブラリです。

特に、

  • RSSフィードの解析
  • SOAP APIとの連携
  • レガシーシステム対応
  • XMLベースのWeb API

などでは活躍します。

また、Parker・Badgerfish・GData・OpenRallyといった複数の変換方式に対応しているため、用途に応じて最適なJSON形式を選択できる点も大きな魅力です。XMLをJSONへ変換して、Flutterで扱いやすいデータ構造にしたい場合は、ぜひ活用してみてください。

タイトルとURLをコピーしました