可能重复:
Best XML parser for Java
How i can convert this xml file into an XML object?
我有这样的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 :(得分:4)
<强>更新强>
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
方法。
@XmlRootElement(name="P1)
public class P1 {
List<CTS> cts;
@XmlElement(name = "CTS")
public List<CTS> getCts() {
return cts;
}
}
了解更多信息
完整示例
<强> 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>
了解更多信息
答案 1 :(得分:0)
我可以看到两个问题:
1)您需要在P1.class
中使用JAXBContext
。你还没有说Presentation
类是什么,但如果你的根元素是P1
,那就是你在上下文中需要的东西:
JAXBContext jaxbContext = JAXBContext.newInstance(P1.class);
2)您需要指定根xml元素的名称:
@XmlRootElement(name="P1")
public class P1 {
...
答案 2 :(得分: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;
}
答案 3 :(得分: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;
}
}