2015-07-21 58 views
0

我已經創建了XML文件我們稱之爲template.xml。它看起來像這樣:使用JAXB更新XML模板文件

<?xml version="1.0" encoding="UTF-8"?> 
<html> 
    <head> 
    <title>TITLE</title> 
    </head> 
    <body> 
     <div> 
     <section/> 
     <section> 
      <p>section1</p> 
     </section> 
     <section> 
      <p>section2</p> 
     </section> 
     <table/> 
     </div> 
    </body> 
</html> 

現在我想tu unmarshall template.xml並只更改specyfic標記的內容。

我想要做的就是像XSL一樣使用JAXB mashaller。我想要我的模板文件,然後只更改Specyfic標籤。我試圖用的EclipseLink xmlpath中創建模型

package html.model; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name="html") 
public class Html { 


    @XmlPath("body/div") 
    private Div div; 

    public Div getDiv() { 
     return div; 
    } 

    public void setDiv(Div div) { 
     this.div = div; 
    } 



} 

我的計劃是這樣的:

public class Updater { 

    public static void main(String[] args) { 
     try{ 
      File file = new File("html_example.xml"); 
      JAXBContext jc = JAXBContext.newInstance(Html.class); 
      Unmarshaller jaxbUnmarshaller = jc.createUnmarshaller(); 
      Html html = (Html) jaxbUnmarshaller.unmarshal(file); 

      Div div = html.getDiv(); 
      Section section = div.getSection(); 
      section.setName("UPDATED VALUE"); 


      Marshaller jaxbMarshaller = jc.createMarshaller(); 
      jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

      jaxbMarshaller.marshal(html, new File("html_example.xml")); 


     } catch (JAXBException e) {e.printStackTrace();} 
    } 

但我的輸出是:

<?xml version="1.0" encoding="UTF-8"?> 
<html> 
    <body> 
     <div> 
     <section> 
      <p>Jemmy_test</p> 
     </section> 
     <section> 
      <p>UPDATED VALUE</p> 
     </section> 
     <table/> 
     </div> 
    </body> 
</html> 

因此,在這個例子中,我丟失頭標籤。 有什麼辦法讓編組工作變得更聰明一點?

+0

所以,如果你解組這個文件,然後馬上再次對象,它會刪除所有的值?這聽起來好像你沒有正確解析XML文件。 –

+0

我已更新我的問題 – matyyyy

回答

0

問題是你沒有將頭元素映射到任何東西,所以當你解開它只是丟棄它的XML。編組對象會創建一個不知道元素的新文件。

如果您希望再次輸出所有元素,您將需要對xml中的所有元素建模。您可以從xhtml模式生成所有模型,但它會爲您做很多繁重的工作。

+0

是的,我知道如果我使用所有標記創建模型,它將起作用。問題是我不想要這個。在我的模板中會有很多不同的標籤,也有很多不同的標籤。對於我來說,創建只能訪問specyfic標籤的模型會更方便和更易讀。 – matyyyy