我们正在设计一个处理
XML消息的系统.
处理Java类需要从较大的XML中分离出各种属性和值,并将这些作为参数传递给各个处理程序类以进行各种操作.
我们考虑过以下选项:
一个)
将整个XML传递给每个处理程序并让它提取相关的位 – 但是觉得每次传递XML可能效率低下
B)
将XML转换为DTO或一组较小的DTO,并将每个DTO传递给相关的处理程序
C)
将XML剪切成片段并将其传递给每个处理程序方法
我们对这些都不满意,所以有什么建议可以去哪?
示例XML
<IdAction>supplied</IdAction> <RegId>true</RegId> <DeRegId>false</DeRegId> <SaveMessage>false</SaveMessage> <ServiceName>abcRequest</ServiceName> <timeToPerform>3600</timeToPerform> <timeToReceipt/> <SendToBES>true</SendToBES> <BESQueueName>com.abc.gateway.JMSQueue.forAddRequest</BESQueueName> <BESTransform/> <BESJMSProperties> <property> <propName>stateCode</propName> <propValue>OK</propValue> </property> <property> <propName>stateResponse</propName> <propValue>OK</propValue> </property> </BESJMSProperties>
这包含由4个处理程序处理的4个块
<IdAction>supplied</IdAction> <RegId>true</RegId> <DeRegId>false</DeRegId>
另一个
<timeToPerform>3600</timeToPerform> <timeToReceipt/>
接下来呢
<SendToBES>true</SendToBES> <BESQueueName>com.abc.gateway.JMSQueue.forAddRequest</BESQueueName> <BESTransform/> <BESJMSProperties> <property> <propName>stateCode</propName> <propValue>OK</propValue> </property> <property> <propName>stateResponse</propName> <propValue>OK</propValue> </property> </BESJMSProperties>
等等
我不认为你在内存使用或性能方面需要任何特殊的设计考虑,所以我会选择涉及最少编码的解决方案,那就是使用JAXB marshaller将你的xml解析为DTO然后去与您的计划B.也许它比StAX更难设置,但它可以避免编写任何XML解析.
如果你使用Spring很容易为org.springframework.oxm.jaxb.Jaxb2Marshaller设置一个bean
http://static.springsource.org/spring-ws/site/reference/html/oxm.html(8.5.2)