現在では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で扱いやすいデータ構造にしたい場合は、ぜひ活用してみてください。
