2012-12-21 107 views
2

可能重複的XML對象:
Best XML parser for Java
How i can convert this xml file into an XML object?轉換XML文件成一個列表

我有這樣的XML。我想將它轉換成JAVA對象。

<P1> 
    <CTS> 
     Hello 
    </CTS> 
    <CTS> 
     World 
    </CTS> 
<P1>  

所以我創建了下面的java類和它們的屬性。

P1 class

@XmlRootElement 
public class P1 { 
    @XmlElement(name = "CTS") 
    List<CTS> cts; 
} 

CTS class

public class CTS { 
    String ct; 
} 

Test Class

File file = new File("D:\\ContentTemp.xml"); 
      JAXBContext jaxbContext = JAXBContext.newInstance(P1.class); 

      Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
      P1 p = (P1) jaxbUnmarshaller.unmarshal(file); 

但我得到下面的錯誤 -

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 
2 counts of IllegalAnnotationExceptions 
Class has two properties of the same name "cts" 
+0

@everyone我做了我的問題比較簡單,這樣我可以得到答案。 – Thinker

+0

@Kazekage Gaara這只是我的問題。讓它更簡單。 – Thinker

+1

@Thinker人們不是在這裏給一個完整的答案,而是爲了互相幫助找到一種方法 –

回答

4

UPDATE

com.sun.xml.internal.bind。 v2.runtime.IllegalAnnotationsException:2 IllegalAnnotationExceptions計數類有兩個屬性 同名「cts」

默認情況下,JAXB (JSR-222)實現根據屬性和註釋字段創建映射。當你註解一個也有屬性的字段時,會導致這個錯誤。

選項1 - 使用@XmlAccessorType(XmlAccessType.FIELD)

你可以註釋,你需要指定的類@XmlAccessorType(XmlAccessType.FIELD)領域。

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

    @XmlElement(name = "CTS") 
    List<CTS> cts; 

} 

選項#2 - 註解屬性(get方法)

另外,您可以註釋get方法。

@XmlRootElement(name="P1) 
public class P1 { 

    List<CTS> cts; 

    @XmlElement(name = "CTS") 
    public List<CTS> getCts() { 
     return cts; 
    } 

} 

更多信息


FULL例

CTS

您可以使用@XmlValue註釋將Java類映射爲具有簡單內容的複雜類型。

@XmlAccessorType(XmlAccessType.FIELD) 
public class CTS { 

    @XmlValue 
    String ct; 

} 

P1

import java.util.List; 
import javax.xml.bind.annotation.*; 

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

    @XmlElement(name = "CTS") 
    List<CTS> cts; 

} 

演示

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(P1.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum13987708/input.xml"); 
     P1 p1 = (P1) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(p1, System.out); 
    } 

} 

input.xml中/輸出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<P1> 
    <CTS> 
     Hello 
    </CTS> 
    <CTS> 
     World 
    </CTS> 
</P1> 

更多信息

0

兩個問題,我可以看到:

1)你必須在你的JAXBContext使用P1.class。你還沒有說Presentation類是什麼,但如果你的根元素是P1,這就是你的背景下,需要的東西:

JAXBContext jaxbContext = JAXBContext.newInstance(P1.class); 

2)你需要指定根XML元素的名稱:

@XmlRootElement(name="P1") 
public class P1 { 
... 
+0

這是正確的。我已經更改了變量名稱.forgot以在測試類中更改它。 – Thinker

+0

我無法重現您的錯誤,因爲您尚未發佈所有代碼。你有一種叫做'cts()'的方法嗎?如果是這樣,請嘗試將其重命名爲其他內容。 – dogbane

+0

no.this是我的整個代碼。除此代碼外,只有getter和setter。顯示的錯誤是因爲它在xml文件中有兩個cts – Thinker

0

你的XML看起來是這樣的:

<P1> 
    <CTS> 
    Hello 
    </CTS> 
    <CTS> 
    World 
    </CTS> 
</P1> 

但考慮到你的映射它應該看起來像:

<p1> 
    <CTS> 
    <CT> 
    Hello 
    </CT> 
    </CTS> 
    <CTS> 
    <CT> 
    World 
    </CT> 
    </CTS> 
</p1> 

爲了將根元素從p1更改爲P1,使用屬性name@XmlRootElement

如果你想你解析XML發佈的第一個版本,改變你的P1類是這樣的:

@XmlRootElement(name="P1") 
public class P1 { 
    @XmlElement(name = "CTS") 
    List<String> cts; 
} 
+1

僅供參考 - 您可以通過利用「@ XmlValue」註釋將對象模型映射到@Thinker給出的XML:http://stackoverflow.com/a/13988362/383861 –

+1

謝謝Blaise提供的技巧!我不知道「@ XMLValue」。 – Florin

0

你可以嘗試以下方法,

如果你能,使XML爲以下結構。

<P1> 
    <CTSList> 
     <CTS value="Hello"/> 
     <CTS value="World"/> 
    </CTSList> 
<P1> 

和使用,

@XMLRootElement(name="P1") 
public class P1 { 
    List CTSList; 

    @XMLElementWrapper(name="CTSList") 
    @XMLELement(name="CTS") 
    public void setCTSList(List<CTS> ctsList) { 
    this.CTSList = ctsList; 
    } 

    public List<CTS> getCTSList() { 
    return this.CTSList; 
    } 
} 

@XMLRootElement(name="CTS") 
public class CTS { 
    String cts; 

    @XMLAttribute(name = "value") 
    public String getCts() { 
    return this.cts; 
    } 

    public void set setCts(String cts) { 
    this.cts = cts; 
    } 
} 
+0

僅供參考 - 您可以通過利用「@ XmlValue」註釋將對象模型映射到@Thinker給出的XML:http://stackoverflow.com/a/13988362/383861 –