2016-11-02 4 views
0

저는 응용 프로그램에서 XML 문서를 스트리밍하기 위해 Woodstox를 사용하고 있습니다. 처리하기 전에 스키마에서 정의한대로 요소에 대한 기본 특성을 설정해야하지만 Woodstox에서이를 수행하는 유일한 방법은 문서를 기본 XML 특성을 작성하는 논리가있는 추가 XMLStreamReader를 사용하여 메모리로 읽는 것입니다. 메모리 내 XML 문서에 저장 한 다음 메모리 내 문서를 비즈니스 논리로 전달합니다.Java : XMLStreamReader2에서 속성을 설정 하시겠습니까?

나는 이것을 좋아하지 않는다. 문서가 잠재적으로 커질 수 있고 애플리케이션의 여러 인스턴스를 실행 중이므로 요소별로 문서를 스트리밍하여 메모리 사용 공간을 줄이고 싶습니다. 문서를 스트리밍하는 동안 XMLStreamReader에 속성을 삽입하는 방법이 있습니까?

public class XMLPreProcessor extends StreamReader2Delegate { 
    public XMLPreProcessor(XMLStreamReader2 sr) { 
     super(sr); 
    } 

    //Skip over all processing instructions 
    //Can this be extended to inject attributes to elements? 
    @Override 
    public int next() throws XMLStreamException { 
     int eventType = super.next(); 

     while(eventType == XMLStreamConstants.PROCESSING_INSTRUCTION) { 
      eventType = super.next(); 
     } 

     return eventType; 
    } 
} 

이 대표는에 XMLStreamReader에 속성을 주입하는 불통 수 있습니다 : 나는 이미 내가 잠시 스트리밍에 관심이 아니에요 노드를 건너 뛸 수있는 방법을 찾았나요?

답변

1

아니요. 콘텐츠를 삽입 할 수있는 그런 시설이 없다고 생각합니다. 이벤트 API (XMLEventReader)를 사용하는 경우 요소 개체를 수정할 수 있습니다.

그러나 위임을 사용하면 접근 할 수 있습니다. 속성에 액세스하는 모든 메소드를 대체하고 추가 속성의 상태를 유지해야합니다. 그래서 얼마나 많은 애트리뷰트가 있는지 물었을 때 원래 카운트와 주입 된 애트리뷰트를 반환했다. 아마 원본 뒤에 새로운 것들을 추가 할 것입니다. 이것은 실행 가능합니다. START_ELEMENT을 읽을 때마다 상태를 업데이트하려면 next()을 무시하고 발전시킨 후에 버려야 할 수도 있습니다.

+0

XMLEventReader를 사용하여 델리게이트를 마무리하고 요소에 기본 속성을 주입하기 위해'nextEvent()'메소드를 오버로드했습니다. XMLStreamReader에서 오버라이드 할 수있는 메소드가 너무 많습니다. 구현과 관련하여 틈새 기능에 너무 많은 작업이 필요합니다. XMLEventReader를 재정의하는 것이 더 간단하고 구현을 변경하면 다시 작성하기가 더 쉬울 것입니다. – user1428945