2014-09-03 3 views
2

XML 구조가 매우 큽니다. 하나의 요소를 언 마샬링하고 비즈니스 로직을 적용하여이 XML의 일부를 업데이트하려고합니다.JAXB (또는 JAXB + StAX)를 사용하여 XML의 일부를 마샬링 할 수 있습니까?

하위 요소를 POJO로 비 정렬화할 수 있습니다. Java에서이 POJO를 변경 한 다음 동일한 위치의 XML로 다시 업데이트하려고합니다.

JAXB에서 가능합니까? 또는 JAXB + StAX의 조합을 사용합니다.

구성 예 : 위 예에서

<folder id="c5718b36-bab1-4c08-8f75-8e2f9aee42c5" name="Folder-1"> 
     <description> folder Desc</description> 
     <createdBy>User2</createdBy> 
     <hidden>false</hidden> 

     <file id="4f2efb42-0604-4878-9e1e-ae90d66fb836" name="File-1"> 
      <description>file desc</description> 
      <createdBy>User1</createdBy> 
      <hidden>false</hidden> 
     </file> 
</folder> 

, 난 POJO에 '파일'소자 마샬링 수이다. 이 POJO를 변경하고 올바른 위치에서 XML 파일을 업데이트하려고합니다.

어떻게하면됩니까?

도와주세요. 감사합니다. .

답변

3

당신은 JAXB와 StAX를 함께 다음 작업을 수행 할 수 있습니다 : 정보 주셔서

import javax.xml.bind.*; 
import javax.xml.stream.*; 
import javax.xml.stream.events.XMLEvent; 
import java.io.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     XMLInputFactory xif = XMLInputFactory.newFactory(); 
     XMLOutputFactory xof = XMLOutputFactory.newFactory(); 

     try(
      FileInputStream in = new FileInputStream("in.xml"); 
      FileOutputStream out = new FileOutputStream("out.xml"); 
     ) { 
      XMLEventReader xer = xif.createXMLEventReader(in); 
      XMLEventWriter xew = xof.createXMLEventWriter(out); 

      JAXBContext jc = JAXBContext.newInstance(File.class); 
      Unmarshaller unmarshaller = jc.createUnmarshaller(); 
      Marshaller marshaller = jc.createMarshaller(); 
      marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); 

      while(xer.hasNext()) { 
       if(xer.peek().isStartElement() && xer.peek().asStartElement().getName().getLocalPart().equals("file")) { 
        // Unmarshal the File object from the XMLEventReader 
        File file = (File) unmarshaller.unmarshal(xer); 

        // Modify the File object 
        file.description = "NEW DESCRIPTION"; 

        // Marshal the File object to the XMLEventWriter 
        marshaller.marshal(file, xew); 
       } else { 
        // Copy node from reader to writer 
        xew.add(xer.nextEvent()); 
       } 
      } 
     } 
    } 

} 
3

Binder을 시도하십시오 (tutorial 참조). 당신이 StAX를 원하는 경우

, 방법을 참조하십시오

  • javax.xml.bind.Unmarshaller.unmarshal(XMLStreamReader, Class<T>)
  • javax.xml.bind.Marshaller.marshal(Object, XMLStreamWriter)

당신은 스트림 공정을에서 알려진 KLASS을 비 정렬 화 다시 마샬링 할 수 있습니다. 이것은 심지어 "필터"와 같은 프로세스에서 수행 될 수 있습니다. 예 :

  • XML을 StAX를 통해 구문 분석합니다.
  • 처리 할 모습이 나타날 때까지 다음 이벤트를 확인합니다.
  • 무의미한 이벤트가 계속 전달됩니다.
  • 관련 이벤트가 발생하면 JAXB를 사용하여 클래스를 비 정렬 화하고 pojo를 처리하여 스트림 작성기로 다시 마샬링합니다.
+0

감사합니다. 바인더는 좋은 해결책이지만 코드에서 DOM을 사용하고 싶지 않았습니다. 대신이 페이지에서 Blaise Doughan의 답변을 활용할 수있었습니다. – metal7