2011-08-10 49 views
8

我們正在設計用於處理XML消息的系統。用於處理大型XML的Java OO設計

處理Java類需要從大型XML中分離出各種屬性和值,並將這些參數作爲參數傳遞給各個處理程序類以進行各種操作。

我們已經想到了以下選項:

A)

傳遞整個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> 

等等

+0

你見過SAX? – kan

+0

@Jeremy:我們需要將XML中的多個片段製作成一個DTO對象 - 這可能很容易嗎? – romesub

+0

你能否提供關於文檔結構的更多細節?例如,是否有一個常見的消息頭需要解析以確定合適的處理程序,並且是一個節點下的主體還是許多兄弟節點? –

回答

3

我不認爲你需要任何特殊的設計考慮內存使用或性能方面,所以我會去使用涉及最少編碼的解決方案,那就是使用JAXB編組器將您的xml解析爲DTO,然後使用您的計劃B.也許設置比StAX更困難,但它可以讓您避免編寫任何XML解析。

http://jaxb.java.net/

如果你正在使用Spring是很容易建立一個bean的org.springframework.oxm.jaxb.Jaxb2Marshaller http://static.springsource.org/spring-ws/site/reference/html/oxm.html(8.5.2)

+0

請記住,如果您使用JAXB生成您的Java pojos已經有了xsd,或者如果你已經有了你的pojos,就可以生成你的xsd。這可以節省你一些工作,如果你使用maven檢查了這一點:http://jaxb.java.net/maven-jaxb-schemagen/generate-mojo.html(對於代碼 - > xsd)和http:// jaxb .java.net/jaxb-maven2-plugin /(用於xsd->代碼) – ilcavero

6

B聽起來像是我最好的選擇。 A是最沒有效率的,C大概需要一次傳球來解析它並挑出碎片,然後第二次傳球來妥善處理它們?

使用SAX解析出最小的DTO集以傳輸到專用處理程序類。

好問題,順便說一句。善於事先考慮這些事情,並獲得第2,3,4個意見:-)

3

試過了嗎? http://simple.sourceforge.net/

就我個人而言,我會爲xml創建一個datamodel並傳遞數據模型。看看教程。使用自定義數據模型,您只能將想要的數據映射到模型中,並且您可以將處理程序類映射到子節點或xml數據模型的子集,而不是整個事物。

如果你有一個XML結構如下

<book> 
    <title>XML</title> 
    <author> 
    <firstname>John</firstname> 
    <lastname>Doe</lastname> 
    </author> 
    <isbn>123541356eas</isbn> 
</book> 

那麼你將有一個數據模型是這樣的:

[ Book  ]   [  Author ] 
---------------   ------------------ 
|String title |   |String firstname| 
|String isbn |   |String lastname | 
|Author author| ------->|----------------| 
---------------   

凡書有作者的引用。 然後您可以將Author對象傳遞給您的處理程序方法。

2

你可以在這個用例中使用StAX。每個processBlock操作將作用於XMLStreamReader的推進它的狀態,那麼後續的processBlock操作可以儘自己的一點:

package forum7011558; 

import java.io.FileReader; 

import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamReader; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Demo demo = new Demo(); 

     FileReader xml = new FileReader("src/forum7011558/input.xml"); 
     XMLInputFactory xif = XMLInputFactory.newFactory(); 
     XMLStreamReader xsr = xif.createXMLStreamReader(xml); 

     demo.processBlock1(xsr); 
     demo.processBlock2(xsr); 
     demo.processBlock3(xsr); 
     demo.processBlock4(xsr); 
    } 

    private void processBlock1(XMLStreamReader xsr) { 
     // PROCESS BLOCK 1 
    } 

    private void processBlock2(XMLStreamReader xsr) { 
     // PROCESS BLOCK 2 
    } 

    private void processBlock3(XMLStreamReader xsr) { 
     // PROCESS BLOCK 3 
    } 

    private void processBlock4(XMLStreamReader xsr) { 
     // PROCESS BLOCK 4 
    } 

} 
+0

是這個stax?它顯示爲jdk 1.6,我將運行在weblogic 10.3上,所以我認爲它覆蓋了? – romesub

+0

@romesub - 是的,這個例子使用Java SE 6(JDK 1.6)中的StAX API。 WebLogic Server 10.3還支持StAX API:http://download.oracle.com/docs/cd/E12840_01/wls/docs103/upgrade/compat.html#wp1114314 –