如何将具有 XML 形式数据的列拆分为新数据库的不同行作为 TALEND 中的 KEY VALUE

How to split a column which has data in XML form to different rows of new Database as KEY VALUE in TALEND

在旧数据库中,我在一列中有一个数据

<ADDRESS>
<CITY>ABC</CITY>
<STATE>PQR</SERVICE>
</ADDRESS>

在我的新数据库中,我希望这些数据以 KEY VALUE 方式存储,例如:

USER_ID            KEY                VALUE
1                  CITY                ABC
1                  STATE               PQR

有人请帮助我如何使用 TALEND 工具迁移此类数据。

我会使用 tJavaFlex。

组件设置:

tJavaFlex 模式:

在开始部分,使用

String input = ((String)globalMap.get("row2.xmlField")); // get the xml Fields value
String firstTag = input.substring(input.indexOf("<")+1,input.indexOf(">"));
input = input.replace("<"+firstTag+">","").replace("</"+firstTag+">","");  
int tagCount = input.length() - input.replace("</", "<").length();
int closeTagFinish = -1;
for (int i = 0; i<tagCount ; i++) { 

在主体部分,解析 XML 标记名称和值,并让输出架构包含这 2 个附加列。主要部分如下:

/*set up the output columns */
output.user_id = ((String)globalMap.get("row2.user_id"));
output.user_first_name = ((String)globalMap.get("row2.user_first_name"));
output.user_last_name = ((String)globalMap.get("row2.user_last_name"));

然后我们可以在不知道 KEY 值的情况下为 XML 计算 key-value 对。

/*calculate columns out of XML */
int openTagStart = input.indexOf("<",closeTagFinish+1);
int openTagFinish = input.indexOf(">",openTagStart);
int closeTagStart = input.indexOf("<",openTagFinish);
closeTagFinish = input.indexOf(">",closeTagStart);
output.xmlKey = input.substring(openTagStart+1,openTagFinish);
output.xmlValue = input.substring(openTagFinish+1,closeTagStart);

tJavaFlex 结束部分:

}

输出如下:

.-------+---------------+--------------+------+--------.
|                      tLogRow_2                       |
|=------+---------------+--------------+------+-------=|
|user_id|user_first_name|user_last_name|xmlKey|xmlValue|
|=------+---------------+--------------+------+-------=|
|1      |foo            |bar           |CITY  |ABC     |
|1      |foo            |bar           |STATE |PQR     |
'-------+---------------+--------------+------+--------'

设计工作如下。

tOracleInput---tExtractXMLFiled---输出。

  1. tOracleInput 组件您可以 select XML 列并将数据类型设为字符串。
  2. tExtractXmlFiled 组件将此 XML 列作为“XML Filed”传递,并将 Loop xpath 表达式设置为“/ADDRESS”
  3. 在城市和州的 tExtractXmlFiled 输出架构中添加新的两列
  4. 在映射中为城市“/ADDRESS/CITY”和州“/ADDRESS/STATE”设置 XPath 查询
  5. 现在你在输出中有两个值。

查看图片了解更多详情。

正如我在您之前的 post 中所解释的那样,您可以按照相同的方法制作键值对。
how-to-split-one-row-in-different-rows-in-talend

或者您可以像这里一样使用 tUnpivot 组件。

正如你所说的源数据有特殊字符然后使用下面的表达式来替换它。

步骤:在oracle输入后添加tMap并使用此代码替换特殊符号

row24.XMLField.replaceAll("&", "<![CDATA["+"&"+"]]>")   

完成后执行作业并查看它应该工作的结果。