2011-08-10 2 views
8

우리는 XML 메시지 처리 시스템을 설계하고 있습니다.대형 XML 처리를위한 Java OO 설계

처리 Java 클래스는 largish XML에서 다양한 속성과 값을 분리하여 다양한 조작을 위해 매개 변수로 개별 처리기 클래스에 전달해야합니다. 그러나이 때마다

주위에 XML을 전달하는 비효율적 일 수도 느낌 - 각 처리기에 전체 XML을 통과하고 관련 비트를 추출 할 수

A)

:

는 우리는 다음과 같은 옵션의 생각

B)

관련 처리기에 각각 DTO를 DTO XML로 변환 이하 DTO들 집합 및 전달

C)

하므로, 어떠한 제안하는 방식으로 가고, 조각으로 XML을 잘라 우리는 이들 각각에 만족하지 않은 각 처리기 메서드

이러한 통과?

이 하나

<IdAction>supplied</IdAction> 
    <RegId>true</RegId> 
    <DeRegId>false</DeRegId> 

않는 4 핸들러에 의해 처리 된 4 개 개의 블록을 포함

<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> 

예 XML 다른 수행

<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를 본 적이 org.springframework.oxm.jaxb.Jaxb2Marshaller 에 대한 빈을 설정하는 것은 매우 쉽습니다? – kan

+0

@Jeremy : 하나의 DTO 객체로 만들기 위해 XML 전체에서 여러 개의 스 니펫이 필요합니다. – romesub

+0

문서의 구조에 대한 자세한 내용을 제공해 주시겠습니까? 예를 들어, 적절한 핸들러를 결정하기 위해 구문 분석되어야하는 공통 메시지 헤더가 있고 한 노드 아래의 본문 또는 많은 형제 노드가 있습니까? –

답변

3

: 각 processBlock 작업은 후속 processBlock 작업이 자신의 비트를 할 수있는, 그 상태를 진전에 XMLStreamReader에 역할을합니다 가장 적은 양의 코딩이 포함 된 솔루션을 사용하면 XML을 DTO로 구문 분석 한 다음 JAXB 마샬 러를 사용하여 DTO로 구문 분석 한 다음 계획 B로 진행하는 것이 좋습니다. 아마도 StAX보다 설정하는 것이 더 어려울 수도 있지만 XML 파싱.

http://jaxb.java.net/

당신이 사용하는 경우 봄 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 (code-> xsd) 및 http : // jaxb .java.net/jaxb-maven2-plugin/(for xsd-> code) – ilcavero

6

B는 나에게 가장 좋은 옵션과 비슷합니다. A는 가장 비효율적이며, C는 아마도 그것을 파싱하고 파편을 고르는 데 한 번 통과해야하고, 두 번째 패스를 제대로 처리하려면 패스 하나가 필요할 것입니다.

전용 핸들러 클래스로의 전송을 위해 최소한의 DTO 세트를 파싱하려면 SAX를 사용하십시오.

좋은 질문, btw. 사전에 이러한 것들을 생각하고, 2, 3, 4 의견을 얻으 려면.

3

시도 했습니까? http://simple.sourceforge.net/

개인적으로 XML 용 datamodel을 만들고 datamodel을 전달합니다. 자습서를 살펴보십시오. 사용자 정의 데이터 모델을 사용하면 원하는 데이터 만 모델에 매핑 할 수 있으며 핸들러 클래스는 전체 노드가 아닌 자식 노드 나 XML 데이터 모델의 하위 집합을 전달할 수 있습니다.

당신은 다음과 같은 구조

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

있는 XML이있는 경우 그 다음이 같은 데이터 모델 뭔가있을 것 : 책은 저자에 대한 참조가

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

. 그리고 Author 객체를 처리기 메서드에 전달할 수 있습니다.

2

이 사용 사례에는 StAX를 사용할 수 있습니다. 난 당신이 내가 갈 것 메모리 사용이나 성능면에서 특별한 설계 고려 사항을 필요가 있다고 생각하지 않습니다

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 –