Dom 提取数组中元素(XML)的值,并将其放入Camel的message属性中
正如您可以看到的可用性标志一样,BeamId正在重复。如何遍历和设置Availability Flag1等的属性,以便稍后使用velocity模板获取它Dom 提取数组中元素(XML)的值,并将其放入Camel的message属性中,dom,apache-camel,Dom,Apache Camel,正如您可以看到的可用性标志一样,BeamId正在重复。如何遍历和设置Availability Flag1等的属性,以便稍后使用velocity模板获取它 Payload:<ns2:TransportFeasibilityResponse> <ns2:Parameters> <ns2:AvailabilityFlag>true</ns2:AvailabilityFlag> <ns2:SatellitedID>H1B</ns2:Sat
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);
我不确定我是否正确理解了您的问题,但我认为您可以使用该模式按照
参数标记分割xml,然后分别处理并在以后聚合
以该输入为例:
<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>
我放在正文中的数据只是一个例子,但是你可以在AggregationStrategy
实现中的Exchange
中设置任何你想要的位置。我认为与其实现整个聚合器,不如重用一些已经实现的,可能是AggregationStrategy。灵活(String.class).AccumerateInCollection(ArrayList.class)
--此代码未经测试。你说得对。但询问者可能需要一个自定义实现。这就是我向他展示整个实现的原因。谢谢Ricardo,你响应得很快。请参阅下面的答案。谢谢你们的见解。由于我非常迫切地需要它,我开始研究不同的方法。我使用了org.w3c.dom package(特别是节点列表),遍历每个节点并将其放入hashmap中。由于我有唯一的键,所以我能够获得值并在velocity模板中设置它们。
Thanks
<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>
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}");
675,111