2014-09-03 40 views
2

我有一個非常巨大的XML結構。 我想通過解組一個元素然後應用業務邏輯來更新此XML的各個部分。XML的一部分可以使用JAXB(或JAXB + StAX)進行編組嗎?

我可以將一個子元素解組到一個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)

您可以從流,並處理解組已知克拉斯和元帥回來。這甚至可以在類似「過濾器」的過程中完成。 I.e .:

  • 您可以通過StAX解析您的XML。
  • 你檢查即將到來的事件,直到你看到你想要處理的東西。
  • 不相關的事件進一步傳遞。
  • 當您得到相關事件時,您使用JAXB解組您的類,處理pojo並將其編組回到流編寫器。
+0

感謝您的信息。 Binder是一個很好的解決方案,但我不想在代碼中使用DOM。相反,我可以在此頁面中使用Blaise Doughan的答案。 – metal7 2014-09-05 08:29:02