はじめに
ASTERIAではXMLデータを処理することができ、そのフィールド定義には名前空間を使用することも可能です。
名前空間は接頭辞(Prefix)と名前空間識別子(URI)を用いて宣言するようです。
今回は名前空間のプレフィックスが、異なるURIで複数定義されているXMLを処理する機会があり、調べてみました。
環境
- OS:Windows Server 2012 R2
- ASTERIA WARP:1712
- Java:1.8.0_151
名前空間を指定するところ
デザイナーのストリームペインでストリーム型:XML としたときに表示される「名前空間」をクリックするとネームスペースの設定ウィンドウが表示されてきます。ここでPrefixとURIを定義できるようです。
定義したあとは、フィールド名で[プレフィックス]:[フィールド名]
として設定しておきます。
マニュアルにも記述がありました。
フローサービスマニュアル - はじめに - フローの構成要素 - ストリームプロパティ - XML より
名前空間プロパティ
フィールド定義で、要素名、属性名にPrefix付きの名前を使用する場合、そのPrefixを名前空間プロパティで指定する必要があります。指定が無い場合、エラーが発生します。
デフォルトネームスペースを使用する場合、Prefixフィールドに「#default」を入力します。
名前空間を指定するには、以下の手順で行います。
名前空間プロパティの値フィールドをクリックします。
「ネームスペースの設定」ダイアログボックスで、PrefixとURIを入力します。
「OK」をクリックします。
基本動作確認
まずは基本動作から。
サンプルXMLファイル
以下のようなxmlファイルを用意しました。
<?xml version="1.0" encoding="utf-8"?>
<list:employlist xmlns:emp="http://www.hoge.org/xyz" xmlns:list="http://www.hoge.org/abc">
<list:personList>
<emp:empID>001</emp:empID>
<emp:name>ASTERIA太郎</emp:name>
</list:personList>
<list:personList>
<emp:empID>002</emp:empID>
<emp:name>ASTERIA次郎</emp:name>
</list:personList>
<list:personList>
<emp:empID>003</emp:empID>
<emp:name>ASTERIA花子</emp:name>
</list:personList>
<list:personList>
<emp:empID>004</emp:empID>
<emp:name>ASTERIA三郎</emp:name>
</list:personList>
<list:personList>
<emp:empID>005</emp:empID>
<emp:name>ASTERIA桃子</emp:name>
</list:personList>
</list:employlist>
フロー概要
FileGet -> Mapper -> EndResponseだけのXMLからCSVに変換する簡単なフローで確認しました。
名前空間プロパティの定義
上記サンプルの場合であれば、FileGetの出力XMLストリームの名前空間プロパティは
Prefix | URI |
---|---|
list | http://www.hoge.org/abc |
emp | http://www.hoge.org/xyz |
で十分です。
実行結果
フローの実行結果です。
プレフィックス複数定義のXML
本題に入ります。
サンプルXMLファイル
上記のサンプルを少し編集し、以下としました。
<?xml version="1.0" encoding="utf-8"?>
<list:employlist xmlns:emp="http://www.hoge.org/xyz" xmlns:list="http://www.hoge.org/abc">
<list:personList xmlns:list="http://www.hoge.org/abc2">
<emp:empID>001</emp:empID>
<emp:name>ASTERIA太郎</emp:name>
</list:personList>
<list:personList xmlns:list="http://www.hoge.org/abc2">
<emp:empID>002</emp:empID>
<emp:name>ASTERIA次郎</emp:name>
</list:personList>
<list:personList xmlns:list="http://www.hoge.org/abc2">
<emp:empID>003</emp:empID>
<emp:name>ASTERIA花子</emp:name>
</list:personList>
<list:personList xmlns:list="http://www.hoge.org/abc2">
<emp:empID>004</emp:empID>
<emp:name>ASTERIA三郎</emp:name>
</list:personList>
<list:personList xmlns:list="http://www.hoge.org/abc2">
<emp:empID>005</emp:empID>
<emp:name>ASTERIA桃子</emp:name>
</list:personList>
</list:employlist>
フロー概要
さきほどのフローと同様です。
名前空間プロパティの定義
list接頭辞が異なるURIで2回定義されているので、デザイナーの名前空間プロパティでも
Prefix | URI |
---|---|
list | http://www.hoge.org/abc |
emp | http://www.hoge.org/xyz |
list | http://www.hoge.org/abc2 |
と2回定義しようとしたら
「ネームスペースプレフィックスが重複しています:list」
とメッセージが出力され作成できませんでした。
デザイナーの名前空間プロパティで同じ名前空間のプレフィックスを指定することはできないようです。
つぎに、定義したprefixとXMLインスタンス中に現れるprefixは実は関係なく、適当な名前に定義上は置き換えておくことが可能らしいので試してみました。
Prefix | URI |
---|---|
list | http://www.hoge.org/abc |
emp | http://www.hoge.org/xyz |
list2 | http://www.hoge.org/abc2 |
フィールド定義のプレフィックスも変更しています。
実行結果
フローの実行結果です。
データを取得できているようです。
XML定義のインポート操作
デザイナーでフィールド定義のインポートができますが、
インポートするXMLファイルに複数の同名プレフィックスが定義されている場合は、名前空間プロパティの定義時と同じようにエラーになるようです。
メッセージから重複しているプレフィックスは判断できるのでインポートするXMLファイルを編集するなりしてひとまずインポートできるようにして、そのあとに名前空間プロパティの定義を編集するのが簡単だと思います。
おわりに
XMLマスターポイントレッスン ~ ベーシック編 ~第11回 XML名前空間でも
同じ名前空間接頭辞を使用して、名前空間識別子だけを変更することもできます。
と記載があるのでXMLとしては問題ない構造のようです。
フローで処理するときは少しテクニックが必要ですが、これで問題なく処理できました。
今回は読み込み部分だけを確認しましたが、逆にファイル出力したいときはこの方法は使えず、別々にXMLを作成してXMLMergeコンポーネントなどでノードを差し込むなどの対応になるかと思います。