我们正在设计一个处理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>
Run Code Online (Sandbox Code Playgroud)
这包含由4个处理程序处理的4个块
<IdAction>supplied</IdAction>
<RegId>true</RegId>
<DeRegId>false</DeRegId>
Run Code Online (Sandbox Code Playgroud)
另一个
<timeToPerform>3600</timeToPerform>
<timeToReceipt/>
Run Code Online (Sandbox Code Playgroud)
接下来呢
<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>
Run Code Online (Sandbox Code Playgroud)
等等
B听起来对我来说是最好的选择.A是最低效的,C可能需要一次传递来解析它并挑出碎片,然后第二次传递来正确处理它们?
使用SAX解析最小DTO集以传输到专用处理程序类.
好问题,顺便说一下.很高兴提前考虑这些事情,并得到第2,第3,第4意见:-)
我认为您不需要在内存使用或性能方面进行任何特殊的设计考虑,因此我会采用涉及最少编码量的解决方案,即使用 JAXB 编组器将 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 )
| 归档时间: |
|
| 查看次数: |
276 次 |
| 最近记录: |