0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ASTERIA WARPで名前空間のプレフィックスが異なるURIで複数定義されているXMLを処理する方法

Posted at

はじめに

ASTERIAではXMLデータを処理することができ、そのフィールド定義には名前空間を使用することも可能です。
名前空間は接頭辞(Prefix)と名前空間識別子(URI)を用いて宣言するようです。
今回は名前空間のプレフィックスが、異なるURIで複数定義されているXMLを処理する機会があり、調べてみました。

環境

  • OS:Windows Server 2012 R2
  • ASTERIA WARP:1712
  • Java:1.8.0_151

名前空間を指定するところ

デザイナーのストリームペインでストリーム型:XML としたときに表示される「名前空間」をクリックするとネームスペースの設定ウィンドウが表示されてきます。ここでPrefixとURIを定義できるようです。

XMLプレフィックス01.png

定義したあとは、フィールド名で[プレフィックス]:[フィールド名]として設定しておきます。
マニュアルにも記述がありました。
フローサービスマニュアル - はじめに - フローの構成要素 - ストリームプロパティ - 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に変換する簡単なフローで確認しました。

XMLプレフィックス02.png

名前空間プロパティの定義

上記サンプルの場合であれば、FileGetの出力XMLストリームの名前空間プロパティは

Prefix URI  
list http://www.hoge.org/abc 
emp http://www.hoge.org/xyz

で十分です。

XMLプレフィックス03.png

実行結果

フローの実行結果です。

XMLプレフィックス04.png

プレフィックス複数定義の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」
とメッセージが出力され作成できませんでした。

XMLプレフィックス05.png

デザイナーの名前空間プロパティで同じ名前空間のプレフィックスを指定することはできないようです。
つぎに、定義したprefixとXMLインスタンス中に現れるprefixは実は関係なく、適当な名前に定義上は置き換えておくことが可能らしいので試してみました。

Prefix URI  
list http://www.hoge.org/abc  
emp http://www.hoge.org/xyz
list2 http://www.hoge.org/abc2 

XMLプレフィックス06.png

フィールド定義のプレフィックスも変更しています。

実行結果

フローの実行結果です。

XMLプレフィックス07.png

データを取得できているようです。

XML定義のインポート操作

デザイナーでフィールド定義のインポートができますが、

XMLプレフィックス08.png

インポートするXMLファイルに複数の同名プレフィックスが定義されている場合は、名前空間プロパティの定義時と同じようにエラーになるようです。

XMLプレフィックス09.png

メッセージから重複しているプレフィックスは判断できるのでインポートするXMLファイルを編集するなりしてひとまずインポートできるようにして、そのあとに名前空間プロパティの定義を編集するのが簡単だと思います。

おわりに

XMLマスターポイントレッスン ~ ベーシック編 ~第11回 XML名前空間でも

同じ名前空間接頭辞を使用して、名前空間識別子だけを変更することもできます。

と記載があるのでXMLとしては問題ない構造のようです。
フローで処理するときは少しテクニックが必要ですが、これで問題なく処理できました。
今回は読み込み部分だけを確認しましたが、逆にファイル出力したいときはこの方法は使えず、別々にXMLを作成してXMLMergeコンポーネントなどでノードを差し込むなどの対応になるかと思います。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?