节点迭代 Pentaho xpath

Node iteration Pentaho xpath

我需要帮助,

我有一个 XML 文件,其数据格式为:

<GetReservationRS>
  <Reservation>
    <BookingDetails>
      <RecordLocator>WYCZOE</RecordLocator>
      <CreationTimestamp>2016-07-28T11:47:00</CreationTimestamp>
    </BookingDetails>
    <PassengerReservation>
      <Passengers>
        <Passenger id="5" nameType="S" nameId="01.01">
          <LastName>BARRERA</LastName>
          <FirstName>EDITH</FirstName>
          <Seats />
        </Passenger>
        <Passenger id="6" nameType="S" nameId="02.01">
          <LastName>TORRES</LastName>
          <FirstName>ADRIANA</FirstName>
          <Seats />
        </Passenger>
      </Passengers>
    </PassengerReservation>  
  </Reservation>    
</GetReservationRS>

现在我希望输出是一个文本文件,其中包含像这样的列名和记录(RecordLocator duplicated 两个 Passenger 案例):

RecordLocator    LastName   FirstName
WYCZOE           BARRERA    EDITH
WYCZOE           TORRES     ADRIANA

输出数据应如上所示 table。我们如何在pentaho.

中实现循环

谢谢

在转换中使用 Get XMl 步骤

Xpath - /GetReservationRS/Reservation/PassengerReservation/Passengers/Passenger

字段

名称 XPath 元素结果类型类型
RecordLocator ../../../BookingDetails/RecordLocator 字符串的节点值
CreationTimestamp ../../../BookingDetails/CreationTimestamp 字符串的节点值
LastName LastName 字符串的节点值
FirstName 字符串的 FirstName 节点值

你会得到你的输出

谢谢

下面是使用 XPath 和 VTD 的 java 代码-XML...它被编码为非常通用的..并且经过测试...

import com.ximpleware.*;

public class extractData {
    public static void main(String[] s) throws VTDException {
        VTDGen vg= new VTDGen();
        if (!vg.parseFile("d:\xml\table.xml", false)){
            System.out.println("xml not parsed correctly");
            return;
        }
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn),
                ap1=new AutoPilot(vn),
                ap2=new AutoPilot(vn),
                ap3=new AutoPilot(vn);
        ap.selectXPath("/GetReservationRS/Reservation");
        ap1.selectXPath("BookingDetails/RecordLocator");
        ap2.selectXPath("PassengerReservation/Passengers/Passenger");
        System.out.println("RecordLocator \t LastName \t FirstName");
        int i=0,j=0,k=-1,l=-1;
        while((i=ap.evalXPath())!=-1){
            String rl = ap1.evalXPathToString();
            while((j=ap2.evalXPath())!=-1){
                if (vn.toElement(VTDNav.FIRST_CHILD,"LastName")){
                    k=vn.getText();
                    vn.toElement(VTDNav.P);
                }
                if (vn.toElement(VTDNav.FIRST_CHILD,"FirstName")){
                    l=vn.getText();
                    vn.toElement(VTDNav.P);
                }

            String s1="";
            String s2="";
            if (k!=-1){
                s1 = vn.toString(k);
            }
            if (l!=-1){
                s2 = vn.toString(l);
            }
            System.out.println(rl+" \t\t "+s1+" \t "+s2);
            }
            ap2.resetXPath();
        }
    }
}