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

# はじめに

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](https://qiita-image-store.s3.amazonaws.com/0/180292/80a34e1d-fe74-8bb6-83fc-95e151ce06ca.png)

定義したあとは、フィールド名で`[プレフィックス]:[フィールド名]`として設定しておきます。
マニュアルにも記述がありました。
[フローサービスマニュアル - はじめに - フローの構成要素 - ストリームプロパティ - XML](https://help.asteria.com/documentation/warp/ja/current/flow/designer/flowservice/stream_xml.html) より
> 名前空間プロパティ
フィールド定義で、要素名、属性名にPrefix付きの名前を使用する場合、そのPrefixを名前空間プロパティで指定する必要があります。指定が無い場合、エラーが発生します。

>デフォルトネームスペースを使用する場合、Prefixフィールドに「#default」を入力します。

>名前空間を指定するには、以下の手順で行います。

>名前空間プロパティの値フィールドをクリックします。
「ネームスペースの設定」ダイアログボックスで、PrefixとURIを入力します。
「OK」をクリックします。

# 基本動作確認
まずは基本動作から。

## サンプルXMLファイル
以下のような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](https://qiita-image-store.s3.amazonaws.com/0/180292/76035739-0cb5-ae19-a001-8b85f5ab89eb.png)

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

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

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

で十分です。

![XMLプレフィックス03.png](https://qiita-image-store.s3.amazonaws.com/0/180292/ab8c6e8b-df4e-0688-7a76-02833301d54a.png)

## 実行結果

フローの実行結果です。

![XMLプレフィックス04.png](https://qiita-image-store.s3.amazonaws.com/0/180292/d1200f6b-d1d5-850e-1867-c3e2ba2efe5a.png)

# プレフィックス複数定義のXML

本題に入ります。

## サンプル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で２回定義されているので、デザイナーの名前空間プロパティでも

| 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](https://qiita-image-store.s3.amazonaws.com/0/180292/1736d12d-36e4-4b62-3638-e5ffda5e3841.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](https://qiita-image-store.s3.amazonaws.com/0/180292/8bc287e5-d2c9-dea3-61fa-43b4dddc2e97.png)


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

## 実行結果

フローの実行結果です。

![XMLプレフィックス07.png](https://qiita-image-store.s3.amazonaws.com/0/180292/cff53d5e-68bb-ae3a-fa8c-9ed8310f4865.png)

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

## XML定義のインポート操作

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

![XMLプレフィックス08.png](https://qiita-image-store.s3.amazonaws.com/0/180292/86467534-6141-43b2-4022-9fd916714df7.png)

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

![XMLプレフィックス09.png](https://qiita-image-store.s3.amazonaws.com/0/180292/e92ce00b-e48f-50e9-f565-307279f1132a.png)

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

# おわりに

[XMLマスターポイントレッスン ～ ベーシック編 ～第11回　XML名前空間](http://www.xmlmaster.org/article/d01/c11/)でも

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

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