2017-02-01 8 views
0

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

<root> 
    <creditreport> 
    <data1> 
     <A>val1</A> 
     <B>val2</B> 
    </data1> 
    <data2> 
     <C>val3</C> 
     <D>val4</D> 
    </data2> 
    <data3> 
    <E>val5</E> 
    <F>val6</F> 
    </data3> 
    <data3> 
    <G>val7</G> 
    <H>val8</H> 
    </data3> 
    </creditreport> 
</root> 

Сейчас в Kettle Я проектирование общих рамок, которые бы принести XML и лоскуток его в базу данных. Я использую компонент «Получить XML-данные» для чтения XML. я определил «Xpath петля», как корень/CreditReport, а затем я прочитал полей один за другим что-то как:

name xpath Element ResultType 
A  data1 Node  Valueof 
B  data1 Node  Valueof 
..... 
..... 
..... 
E  data3 Node  Valueof 
..... 
..... 
G  data3 Node  Valueof 

Но проблема в том, что это измельчением только первый ряд для и отсутствует второе. Я могу понять причину, поскольку цикл XPATH только до. Если я определяю «цикл xpath» как «root/creditreport/data3», тогда проблема для элемента «data3» разрешается, но есть и другие элементы, которые могут повторяться, а затем я буду стоять снова в начальной точке моей проблемы.

Любой совет !!

+0

ли вы имеете в виду второе "CreditReport" запись не обрабатывается или второй ряд элементов Datax? – Cyrus

+0

@Cyrus Вторая строка данных Элементы DataX –

ответ

2

Если оба родителя (Datax) и дочерние узлы (A, B, C, и т.д.) действительно уникальны/последовательны вы можете сделать один очень общие настройки:

Используйте /root/creditreport/*/* как путь петли XPath

Настройте поля, как это вручную:

Field definitions in Get Data from XML

что вы должны получить выход так:

Output sample

Здесь вы можете денормализовать или иным образом обрабатывать ваши данные по своему усмотрению. Обратите внимание, что я добавил порядковый номер для узлов на родительском уровне, поэтому вы можете отличить первый Data3 от второго и т. Д.

Если, с другой стороны, все узлы dataX имеют одинаковые дочерние узлы (A , BA, B, а не A, BC, D и т. Д.), Вы можете использовать /root/creditreport/* в качестве пути цикла xpath и пропустить поле родительского узла, обычно настраивая свой узел значений A и B.

Вот определения и вывод. Все поля определены относительно текущего узла (.).

enter image description here

enter image description here

+0

Wow !! Только то, что я хотел. Ты жжешь!! –

+0

@ Cyrus-Just один маленький вопрос. Когда я выбираю второй вариант, указанный в вашем решении, то есть устанавливая/root/creditreport/* и обычно настраивая узлы, несколько пустых строк также выделяются из требуемых строк. Есть идеи!! –

+0

Например, если в моем вопросе я уже упоминал выше, если имеет две записи вместе с , тогда вывод идет как две требуемые строки для и две пустые строки. и аналогично для . –