4
4

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.

Talend tXMLMap での XML 加工時のポイント

Posted at

Talend (Open Studio利用) でよく利用する tXMLMap について、慣れるまでに苦労した点を、つらつらと記録します。

1. Create empty element

Create empty element を false にしても、XMLで確認すると空ノードが生成されてしまっている事が多かった。
不具合かと思っていたが、実は分かっていなかっただけだったのでメモ。

値や属性が空文字の場合は、ノードが生成される。
値や属性が null の場合は、生成されない。

そういう事だった。

00_design.png

01_tXMLMap_cee_false.png

上のように設定した場合に、出力される XML は以下のようになる。
null を直接代入するとコンパイルエラーになるので、上記設定では true ? null : "" としている。)

<root>
	<EmptyStringNode>
		<item></item> <!-- 値が空文字 -->
	</EmptyStringNode>
	<NullWithEmptyAttr dummy=""/> <!-- 属性が空文字 -->
</root>

Create empty element が true ならこうなる。比較すると一目瞭然:

<root>
	<EmptyStringNode>
		<item></item> <!-- 値が空文字 -->
	</EmptyStringNode>
	<NullNode>
		<item/> <!-- 値がnull -->
	</NullNode>
	<NullWithEmptyAttr dummy=""> <!-- 属性が空文字 -->
		<item/>
	</NullWithEmptyAttr>
	<NullWithNullAttr dummy=""> <!-- 属性がnull -->
		<item/>
	</NullWithNullAttr>
</root>

2. 複数loopとAll in one

XML から直接 XML へ値を移したい時は、loop element の位置と All in one の設定に注目する。

例えば次のような XML をまるごとコピーしたいと仮定する(実際のケースはもっと複雑だろうが)。

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <loop1> <!-- 親1に対して子3 -->
        <item>
            <A>A1</A>
            <B>B1</B>
        </item>
        <item>
            <A>A2</A>
            <B>B2</B>
        </item>
        <item>
            <A>A3</A>
            <B>B3</B>
        </item>
    </loop1>
    <loop2> <!-- 親1に対して子2 -->
        <item>
            <C>C1</C>
            <D>D1</D>
        </item>
        <item>
            <C>C2</C>
            <D>D2</D>
        </item>
    </loop2>
</root>

次のように設定してやれば、まるごとコピーできる。
必要となるループ回数は、3 + 2 で 5回。その結果を All in one でまとめる具合に。

02_tXMLMap_multiloop.png

試しに All in one を false にすると、5 rows 生成されることが確認できるはず。


3. ツリースキーマエディター

自分でもまったく愚かだったと思うのは、「ツリースキーマエディター」の存在にしばらく気づかなかった事。
それまで、XML の各ノードの型指定はできないものと思っていた。すべて文字列扱い?などと誤解していた。

03_tXMLMap_treeschema.png

例えば日付として認識できる値は、上図のように直接日付型として読み取れる。
わざわざ TalendDate.parseDate() を経由して加工する必要はない。(してました。)


4. おまけ:Document型とObject型の相互変換

例えば子ジョブに XML データを渡したいな、と考えても、context 経由では Document 型を渡せない。
でも、一度 Object 型に変換してやれば渡せる。

  1. contexts に Object 型の項目を用意する。(この例では xmlDoc)
  2. 子ジョブにも同じものを用意する。
  3. 親ジョブ側では、tRunJob の手前に tJavaRow を加える。
  4. tJavaRow で context.xmlDoc = input_row.payload; と代入する。(payload は Document型)
  5. tRunJob で xmlDoc を子ジョブへ渡す。
  6. 子ジョブの tJavaRow で output_row.payload = (Document)context.xmlDoc; でキャストして戻す。

親ジョブ:
04_tJavaRow_Doc2Obj.png

子ジョブ:
05_tJavaRow_Obj2Doc.png


(以上)

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?