Как разделить столбец с данными в форме XML на разные строки новой базы данных как KEY VALUE в TALEND

В старой БД у меня есть данные в одном столбце как

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

В моей новой БД я хочу, чтобы эти данные хранились в формате KEY VALUE, например:

USER_ID            KEY                VALUE
1                  CITY                ABC
1                  STATE               PQR

Кто-нибудь, пожалуйста, помогите мне, как перенести такие данные с помощью инструмента TALEND.


person user3592257    schedule 08.01.2015    source источник
comment
И моя старая, и новая база данных - оракул   -  person user3592257    schedule 08.01.2015
comment
Существует ли стандартный формат для столбца XML?   -  person ydaetskcoR    schedule 08.01.2015
comment
@ydaetskcoR Не понял, о чем вы пытаетесь спросить. В одном из моих столбцов у меня есть значения, которые я упомянул в вопросе   -  person user3592257    schedule 09.01.2015
comment
Да, но всегда ли это выглядит так или в XML иногда есть дополнительные элементы?   -  person ydaetskcoR    schedule 09.01.2015
comment
Да, он всегда будет иметь значения в этом же формате. Только значения внутри дочерних элементов будут изменены в соответствии с данными пользователя.   -  person user3592257    schedule 09.01.2015


Ответы (2)


Дизайнерская работа, как показано ниже.

tOracleInput --- tExtractXMLFiled --- вывод.

  1. tOracleInput, вы можете выбрать столбец XML и сделать тип данных строковым.
  2. Компонент tExtractXmlFiled передает этот столбец XML как «XML Filed» и устанавливает выражение Loop xpath как «/ADDRESS».
  3. Добавить два новых столбца в выходную схему tExtractXmlFiled для города и ШТАТА.
  4. Установите запрос XPath в сопоставлении для города "/ADDRESS/CITY" и для STATE "/ADDRESS/STATE"
  5. Теперь у вас есть оба значения на выходе.

Смотрите изображение для более подробной информации. введите здесь описание изображения

как я объяснял в своем предыдущем посте, вы можете использовать тот же подход для создания пары значений ключа.
как-разбить-одну-строку-в-разных-рядах-в-таленде

Или вы можете использовать компонент tUnpivot, как здесь.

Как вы сказали, исходные данные имеют специальный символ, а затем используйте выражение ниже, чтобы заменить его.

Шаги: после ввода оракула добавьте tMap и используйте этот код для замены специального символа

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

как только это будет сделано, выполните задание и посмотрите результат, он должен работать.

person UmeshR    schedule 12.01.2015
comment
хороший :) Мой немного общий и использует слишком много Java. - person Balazs Gunics; 12.01.2015
comment
Большое спасибо, Умеш. Я создал работу, и она работает как шарм. Хотя у меня возникает одна проблема при переносе одного значения, в котором я получаю «&», как в City, я получаю значение «And & Nic». Теперь, удалив & с помощью «и», он работает нормально, но с «&» я получаю -- Ошибка в строке 1 документа: имя объекта должно сразу следовать за «&» в ссылке на объект. Вложенное исключение: имя сущности должно следовать сразу за символом «&» в ссылке на сущность. я пытался использовать TalendString.replaceSpecialCharForXML(row3.pivot_value), но все равно получаю ту же ошибку. Не могли бы вы помочь. - person user3592257; 13.01.2015
comment
Я отредактировал свой ответ для обработки специальных символов, проверьте, не исчезнет ли ваша ошибка. - person UmeshR; 13.01.2015
comment
@UmeshR Эй, Умеш... он все еще выдает ту же ошибку... это то, что я использовал в tMap row3.pivot_value.replaceAll(&, ‹![CDATA[+&+]]›) я использую tMap после компонента tUnPivotRow - person user3592257; 13.01.2015
comment
после ввода оракула вы должны добавить tMap и добавить это выражение перед синтаксическим анализом / компонентом tExtractXMlFiled. вы можете нарисовать свой дизайн работы здесь - person UmeshR; 13.01.2015
comment
tOraclInpit--tMap--tExtractXMLFiled---tUnpivot---вывод. это ваша работа дизайн? - person UmeshR; 13.01.2015
comment
Давайте продолжим обсуждение в чате. - person user3592257; 13.01.2015

Я бы использовал 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"));

Затем мы можем вычислить пары ключ-значение для XML, не зная значений KEY.

/*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     |
'-------+---------------+--------------+------+--------'
person Balazs Gunics    schedule 12.01.2015
comment
Спасибо, значение Balazs..xml присутствует в одном из столбцов моей таблицы базы данных. Я не могу понять, как сопоставить этот столбец с tJavaFlex. Пожалуйста помоги. - person user3592257; 12.01.2015
comment
Как использовать tFlowToIterate? - person user3592257; 23.01.2015