将 XML 文件转换为具有列表的 XML 对象 [重复]
Posted
技术标签:
【中文标题】将 XML 文件转换为具有列表的 XML 对象 [重复]【英文标题】:Convert XML file into an XML object having a List [duplicate] 【发布时间】:2012-12-08 21:21:59 【问题描述】:可能重复:Best XML parser for JavaHow 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"
【问题讨论】:
@everyone 我已经把我的问题简化了,这样我就能得到答案。 @Kazekage Gaara 这只是我的问题。让它更简单。 @Thinker 人们来这里不是为了给别人完整的答案,而是为了帮助彼此找到方法 我问我哪里错了。我已经给了我的测试课。 您需要将 package-info.java 放入您生成的 jaxb 包中。 【参考方案1】:更新
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;
更多信息
http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html完整示例
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/Output
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<P1>
<CTS>
Hello
</CTS>
<CTS>
World
</CTS>
</P1>
更多信息
http://blog.bdoughan.com/2011/06/jaxb-and-complex-types-with-simple.html【讨论】:
【参考方案2】:我可以看到两个问题:
1) 您需要在您的JAXBContext
中使用P1.class
。您还没有说Presentation
类是什么,但是如果您的根元素是P1
,那么这就是您在上下文中所需要的:
JAXBContext jaxbContext = JAXBContext.newInstance(P1.class);
2) 您需要指定根xml元素的名称:
@XmlRootElement(name="P1")
public class P1
...
【讨论】:
这是对的。我已经更改了变量名。忘记在测试类中更改它。 我无法重现您的错误,因为您尚未发布所有代码。你也有一个叫做cts()
的方法吗?如果是这样,请尝试将其重命名为其他名称。
no.这是我的全部代码。除了此代码之外,只有 getter 和 setter。显示的错误是因为它在 xml 文件中有两个 cts
不,我已经运行了您发布的代码,它对我有用。根据错误,您在类中有两个名为cts
的属性。它与您的 xml 没有任何关系。
代码在您的系统中运行没有错误?【参考方案3】:
您的 XML 如下所示:
<P1>
<CTS>
Hello
</CTS>
<CTS>
World
</CTS>
</P1>
但考虑到您的映射,它应该如下所示:
<p1>
<CTS>
<CT>
Hello
</CT>
</CTS>
<CTS>
<CT>
World
</CT>
</CTS>
</p1>
为了将根元素从 p1 更改为 P1,请使用属性 name
from @XmlRootElement
。
如果您想解析您发布的第一个 XML 版本,请像这样更改您的 P1 类:
@XmlRootElement(name="P1")
public class P1
@XmlElement(name = "CTS")
List<String> cts;
【讨论】:
仅供参考 - 您可以利用@XmlValue
注释将对象模型映射到 @Thinker 给出的 XML:***.com/a/13988362/383861
感谢 Blaise 的提示!我不知道@XMLValue
。【参考方案4】:
您可以尝试以下方法,
如果可以,请将 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;
【讨论】:
仅供参考 - 您可以利用@XmlValue
注释将对象模型映射到 @Thinker 给出的 XML:***.com/a/13988362/383861以上是关于将 XML 文件转换为具有列表的 XML 对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
无法将类型为“System.Xml.XmlComment”的对象强制转换为类型“System.Xml.XmlElement”