2017-11-29 1 views
0

가용성 플래그를 보면 BeamId가 반복되고 있습니다. 가용성 플래그 1에 대한 속성을 트래버스하고 설정하는 방법은 나중에 속도 템플릿으로 가져올 수 있습니까?배열에있는 요소 (XML)의 값을 추출하여이를 Camel의 message 속성에 넣습니다.

Payload:<ns2:TransportFeasibilityResponse> 
<ns2:Parameters> 
<ns2:AvailabilityFlag>true</ns2:AvailabilityFlag> 
<ns2:SatellitedID>H1B</ns2:SatellitedID> 
<ns2:BeamID>675</ns2:BeamID> 
<ns2:TransportName>Earth</ns2:TransportName> 
</ns2:FeasibilityParameters> 
<ns2:Parameters> 
<ns2:AvailabilityFlag>true</ns2:AvailabilityFlag> 
<ns2:SatellitedID>J34</ns2:SatellitedID> 
<ns2:BeamID>111</ns2:BeamID> 
<ns2:TransportName>Jupiter</ns2:TransportName> 
</ns2:Parameters> 
</ns2:TransportFeasibilityResponse> 
</ns2:TransportFeasibilityResponseMsg> 


Code: (Its not complete) 
public static HashMap<String,String> extractNameValueToProperties(String msgBody, selectedKeyList, namelist) throws Exception { 

     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     factory.setValidating(false); 
     factory.setExpandEntityReferences(false); 
     factory.setNamespaceAware(true); 
     Document doc = null; 
     try{ 
      DocumentBuilder builder = factory.newDocumentBuilder(); 
      doc = builder.parse(new InputSource(new StringReader(msgBody))); 
     } catch(Exception ex) { 
      Exception actException = new Exception("Exception while extracting tagvalues", ex); 
      throw actException; 
     } 

     HashMap<String,String> tagNameValueMap = new HashMap<String,String>(); 
     NodeList nodeList = doc.getElementsByTagName("*"); 
     // Trying to enter the TransportFeasibilityResponse element 
     for (int i = 0; i < nodeList.getLength(); i++) {       
      Node indNode = nodeList.item(i); 
      if (indNode.indexOf(String name)>-1); 

// 가용성 플래그와 유사한 이름 목록

  dataKey = indNode.getTextContent(); 
      message.setProperty(selectedKeyList[k], dataKey); 
      k++; 
      j++;    
      else 
      { 
      continue; 
      } 
      } 


    } 

Here, 
I am setting these values in my route: 

<setProperty propertyName="namelist">          
<constant>AvailabilityFlag,SatellitedID,BeamID</constant> 
</setProperty> 

<setProperty propertyName="selectedKeyList">           
<constant>AvailabilityFlag1,SatellitedID1,BeamID1,AvailabilityFlag2,SatellitedID2,BeamID2 </constant> 
</setProperty> 
<bean beanType="com.gdg.dgdgdg.javacodename" method="extractNameValueToProperties"/> 

질문에 대한 검사 : 나는 반복 요소를 구문 분석과이 속성에 할당 할 수있는 방법을 가르쳐주세요?

Thanks 
+0

귀하의 통찰력에 감사드립니다. 필자는 필자가 급히 필요로 할 때 다른 접근법을 만들기 시작했다. org.w3c.dom 패키지 (특별히 노드 목록)를 사용하고 모든 노드를 통과하여 hashmap에 넣었습니다. 고유 키가 있으므로 값을 가져 와서 속도 템플릿으로 설정할 수있었습니다. – Apu

답변

1

는 내가 제대로 질문을 이해 있는지 확실하지 않습니다,하지만 난 당신이 Parameters 태그 당 XML을 분할하고 개별적으로 서로를 처리하고 나중에 집계하는 Splitter 패턴을 사용할 수 있습니다 생각합니다. 예를 들어

테이크이 입력 : 우리가 Parameters 태그 당 입력을 분할,

from("direct:start") 
    .split(xpath("/TransportFeasibilityResponse/Parameters"), new AggregationStrategy() { 
     public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
      List<String> beamIDs = null; 
      if (oldExchange == null) { // first 
       beamIDs = new ArrayList<String>(); 
      } else { 
       beamIDs = oldExchange.getIn().getBody(List.class); 
      } 

      beamIDs.add(newExchange.getIn().getBody(String.class)); 
      newExchange.getIn().setBody(beamIDs); 
      return newExchange; 
     } 
    }) 
     .setBody(xpath("/Parameters/BeamID/text()")) 
     .end() 
    .log("The final body: ${body}"); 

먼저 한 다음 압축을 풉니 다

<TransportFeasibilityResponse> 
    <Parameters> 
     <AvailabilityFlag>true</AvailabilityFlag> 
     <SatellitedID>H1B</SatellitedID> 
     <BeamID>675</BeamID> 
     <TransportName>Earth</TransportName> 
    </Parameters> 
    <Parameters> 
     <AvailabilityFlag>true</AvailabilityFlag> 
     <SatellitedID>J34</SatellitedID> 
     <BeamID>111</BeamID> 
     <TransportName>Jupiter</TransportName> 
    </Parameters> 
</TransportFeasibilityResponse> 

라우트이 입력을 처리 할 수는 다음과 같이 될 수있다 BeamID. 그 후에 AggregationStrategy은 각 메시지를 하나로 통합하고 BeamID을 그룹화합니다.

마지막 메시지는 가지고 있어야이 같은 신체 : 당신은 어디 설정할 수

675,111 

나는 단지 예를 들어 몸에 넣어 데이터 만

당신이 Exchange 당신이 AggregationStrategy 내부 조작하고로 원하는 이행.

+0

대신 전체 Aggregator를 구현하는 것이 이미 구현 된 일부를 더 잘 재사용 할 수 있다고 생각합니다. 'AggregationStrategies.flexible (String.class) .accumulateInCollection (ArrayList.class)'-이 코드는 테스트되지 않았습니다. – Bedla

+1

포인트가 있습니다. 그러나 구직자는 맞춤 구현이 필요할 수 있습니다. 이것이 내가 전체 구현을 보여준 이유입니다. –

+0

질문에서이 사실을 보지 못했지만, 당신 말이 맞습니다. – Bedla

관련 문제