Dom 提取数组中元素(XML)的值,并将其放入Camel的message属性中

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

正如您可以看到的可用性标志一样,BeamId正在重复。如何遍历和设置Availability Flag1等的属性,以便稍后使用velocity模板获取它

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