documents:etl:pentaho:pentaho-012
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン | |||
| documents:etl:pentaho:pentaho-012 [2025/08/19 02:05] – [パラメタ整理] k896951 | documents:etl:pentaho:pentaho-012 [2026/05/13 03:47] (現在) – k896951 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== 200.KETTLE_XML_MISSING_TAG_YIELDS_NULL_VALUEの件 ====== | ||
| + | KETTLE_XML_MISSING_TAG_YIELDS_NULL_VALUEをYにしていると、ステップ「XMLデータ取得(Get data from XML)」でXPathに関数を使えない。\\ | ||
| + | Pentaho 9.4 でも Pentaho 10.2でも再現する。 | ||
| + | |||
| + | ===== 音声解説 ===== | ||
| + | |||
| + | Google NotebookLMで音声解説を作ってもらいました。動画はまだ英語のみなんだけど近日中に他言語にも対応するとの事。 | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== 発端 ===== | ||
| + | |||
| + | 開発環境で作った.ktr定義を本番に近い環境でテストしたら、XMLの入力だけエラーになる。\\ みんなで頭抱えてたところ、同僚氏が執念に近い献身で差異調査を行って件のパラメタの設定で発生する事を見つけた。いやほんとよく見つけたよ。 | ||
| + | |||
| + | ===== パラメタ整理 ===== | ||
| + | |||
| + | この事象の始まりは、データベースでの空データとnullの扱いを調整するためのパラメタ KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL の追加をした事。\\ | ||
| + | https:// | ||
| + | |||
| + | データベース以外にXMLでも要望があったのか# | ||
| + | |||
| + | ^ # ^ プロパティ ^ 説明 ^ デフォルト ^ 設定値等 ^ | ||
| + | | 1 | KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL | ||
| + | | 2 | KETTLE_DO_NOT_NORMALIZE_NULL_STRING_TO_EMPTY | nullの文字列をemptyに変換するか否か | ||
| + | | 3 | KETTLE_XML_EMPTY_TAG_YIELDS_EMPTY_VALUE | ||
| + | | 4 | KETTLE_XML_MISSING_TAG_YIELDS_NULL_VALUE | ||
| + | |||
| + | **empty : ISBLANK()=Trueになる値** | ||
| + | |||
| + | ===== 推理 ===== | ||
| + | |||
| + | https:// | ||
| + | |||
| + | KETTLE_XML_MISSING_TAG_YIELDS_NULL_VALUE=Y で事が起こるのは、XPathの関数をノード(タグ)だと思って探しに行く処理になっているのではないかと。\\ | ||
| + | ※このパラメタ有効時は、すべてノード(タグ)だと思って処理しているもしくは関数が来ることを想定していない | ||
| + | |||
| + | GitHubリポジトリのコードが現行と一致すると仮定する。\\ | ||
| + | KETTLE_XML_MISSING_TAG_YIELDS_NULL_VALUE=Y の時はSelectSingleNodeメソッドを使うようだけど、ノード検索メソッドならXPath関数は当然ヒットしない。\\ ValueOfメソッドはXPath関数の評価まで面倒を見てくれているんじゃないかな。 | ||
| + | {{.: | ||
| + | |||
| + | ===== 追加検証 ===== | ||
| + | |||
| + | うるさい人が湧いたので実際にコード書いて確かめよう。 | ||
| + | |||
| + | 検証用のコードはこちら。 | ||
| + | <code java xpathCheck.java> | ||
| + | package xpathCheck; | ||
| + | |||
| + | import org.dom4j.Document; | ||
| + | import org.dom4j.io.SAXReader; | ||
| + | |||
| + | public class XPathCheck { | ||
| + | |||
| + | public static void main(String[] args) { | ||
| + | |||
| + | boolean xmlMissingTagYieldsNullValue = false; // KETTLE_XML_MISSING_TAG_YIELDS_NULL_VALUE=N を模す※デフォルト | ||
| + | |||
| + | String filePath = " | ||
| + | String xpathExpression = " | ||
| + | |||
| + | SAXReader rdr = new SAXReader() ; | ||
| + | String nodeValue; | ||
| + | |||
| + | try { | ||
| + | Document doc = rdr.read(filePath); | ||
| + | |||
| + | // KETTLE_XML_MISSING_TAG_YIELDS_NULL_VALUE 問題処理の再現 | ||
| + | if(xmlMissingTagYieldsNullValue) | ||
| + | { | ||
| + | nodeValue = doc.selectSingleNode(xpathExpression) != null ? doc.valueOf(xpathExpression) : null; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | nodeValue = doc.valueOf(xpathExpression); | ||
| + | } | ||
| + | |||
| + | System.out.println(" | ||
| + | System.out.println(" | ||
| + | |||
| + | } catch (Exception e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | |||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 入力データはこちら。 | ||
| + | <code xml Sample.xml> | ||
| + | < | ||
| + | |||
| + | < | ||
| + | |||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | まずデフォルト時(Nが指定された状態)での実行結果。\\ | ||
| + | {{.: | ||
| + | |||
| + | さて次はオプション指定(Yが指定された状態)状態にする。この個所をfalse→trueに変更して実行。 | ||
| + | <code java> | ||
| + | boolean xmlMissingTagYieldsNullValue = true; // KETTLE_XML_MISSING_TAG_YIELDS_NULL_VALUE=Y を模す※オプション指定状態 | ||
| + | </ | ||
| + | |||
| + | 実行結果。見た覚えのあるエラーが出てますでしょ?\\ | ||
| + | {{.: | ||
| + | |||
| + | 念のため、関数ではなく存在しないノードの検索にしてみましょうか。 | ||
| + | <code java> | ||
| + | String xpathExpression = "/ | ||
| + | </ | ||
| + | |||
| + | 実行結果。修正者は関数の時もこの状態が来ると思ってあのコードにしたんでしょうね。やっぱりテストケース不足です。\\ | ||
| + | {{.: | ||
| + | |||
| + | ===== 暫定修正 ===== | ||
| + | |||
| + | ぶっちゃけ、下手にY or Nの条件分岐なんてせずに、valueOf()の処理結果とオプション指定を見て、emptyをnullに変えりゃよかったんですよ。 | ||
| + | |||
| + | <code java xpathCheck2.java> | ||
| + | package xpathCheck; | ||
| + | |||
| + | import org.dom4j.Document; | ||
| + | import org.dom4j.io.SAXReader; | ||
| + | |||
| + | public class XPathCheck { | ||
| + | |||
| + | public static void main(String[] args) { | ||
| + | |||
| + | boolean xmlMissingTagYieldsNullValue = true; // KETTLE_XML_MISSING_TAG_YIELDS_NULL_VALUE=Y を模す | ||
| + | |||
| + | String filePath = " | ||
| + | String xpathExpression = " | ||
| + | |||
| + | SAXReader rdr = new SAXReader() ; | ||
| + | String nodeValue; | ||
| + | |||
| + | try { | ||
| + | Document doc = rdr.read(filePath); | ||
| + | |||
| + | // 暫定的な修正例 | ||
| + | nodeValue = doc.valueOf(xpathExpression); | ||
| + | if((xmlMissingTagYieldsNullValue)&& | ||
| + | |||
| + | System.out.println(" | ||
| + | System.out.println(" | ||
| + | |||
| + | } catch (Exception e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | |||
| + | } | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | 関数の結果も返るし、\\ | ||
| + | {{.: | ||
| + | |||
| + | 存在しないノードの結果はnullになる。\\ | ||
| + | <code java> | ||
| + | String xpathExpression = "/ | ||
| + | </ | ||
| + | {{.: | ||
documents/etl/pentaho/pentaho-012.txt · 最終更新: by k896951
