我的XML文件是:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<DataSet>
<Data id="asdf">
<DataString>Hello</DataString>
<DataValue>1321512</DataValue>
</Data>
<Data id="hghjg">
<DataString>Hello</DataString>
<DataValue>1321512</DataValue>
</Data>
<Data id="klj">
<DataString>Hello</DataString>
<DataValue>1321512</DataValue>
</Data>
<Data id="hghgjh">
<DataString>Hello</DataString>
<DataValue>1321512</DataValue>
</Data>
</DataSet>
使用在线工具生成的我的XSD文件:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="DataSet">
<xs:complexType>
<xs:sequence>
<xs:element name="Data" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="DataString"/>
<xs:element type="xs:int" name="DataValue"/>
</xs:sequence>
<xs:attribute type="xs:string" name="id" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
以下是将xml转换为对象DataSet的Java代码:
JAXBContext jaxbContext = JAXBContext.newInstance(DataSet.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
dataSet = (DataSet) jaxbUnmarshaller.unmarshal(new File("C:\\Users\\Administrator\\Desktop\\testxml.xml"));
System.out.println(dataSet);
但是对于DataSet对象,代码的响应为null。
我不知道我哪里错了。 Plz帮助
DataSet文件看起来像这样。
@XmlRootElement
public class DataSet
{
private Data[] Data;
public Data[] getData ()
{
return Data;
}
@XmlElement
public void setData (Data[] Data)
{
this.Data = Data;
}
@Override
public String toString()
{
return "ClassPojo [Data = "+Data+"]";
}
}
@XmlRootElement
public class Data
{
private String id;
private String DataString;
private String DataValue;
public String getId ()
{
return id;
}
@XmlAttribute
public void setId (String id)
{
this.id = id;
}
public String getDataString ()
{
return DataString;
}
@XmlElement
public void setDataString (String DataString)
{
this.DataString = DataString;
}
public String getDataValue ()
{
return DataValue;
}
@XmlElement
public void setDataValue (String DataValue)
{
this.DataValue = DataValue;
}
@Override
public String toString()
{
return "ClassPojo [id = "+id+", DataString = "+DataString+", DataValue = "+DataValue+"]";
}
}
我使用在线工具创建了pojo。 Plz提供了这里需要的注释 在此先感谢
答案 0 :(得分:1)
以下是DataSet
和Data
类的注释方式:
@XmlRootElement(name = "DataSet")
public class DataSet {
@XmlElementRef
private Data[] Data;
@XmlTransient
public Data[] getData() {
return Data;
}
public void setData(Data[] Data) {
this.Data = Data;
}
@Override
public String toString() {
return "ClassPojo [Data = " + Data + "]";
}
}
@XmlRootElement(name = "Data")
public class Data {
@XmlAttribute
private String id;
private String DataString;
private String DataValue;
// Standard getters and setters.
// WARNING: All getters must be annotated with @Transient.
}
以下是一些规则和解释:
@XmlRootElement
将类标识为JAXB的“可绑定”。 name
属性是可选的,但由于您的XML元素名称以大写字母开头,因此必须包含该属性,否则JAXB将期望dataSet
和data
作为元素名称。DataString
和DataValue
属性可以使用@XmlElement
进行注释,但这不是必需的,因为(1)这是没有注释时的默认行为,以及(2) Java属性名称和XML元素名称匹配。@XmlAttribute
标识一个属性,表示为属性而不是子元素,id
属性为DataSet
。由于Java属性名称和XML属性名称匹配,因此不需要此批注的name
属性。Data
属性,两个id
属性,依此类推。使用@XmlTransient
注释getter或属性会禁用其作为属性的处理,这是我对Data
和DataSet
中所有getter所做的操作。Data
被注释为@XmlRootElement
,因此必须使用@XmlElementRef
注释对它的引用,以便JAXB正确地正确建立属性类型之间的链接(在{{ 1}})和元素类型(DataSet
类)。------------ UPDATE ------------
抱歉,我对Data
属性值的评价过快...您需要Data
和@XmlElement(name = "DataString")
相应的@XmlElement(name = "DataValue")
属性。这又是因为这些属性名称以大写字母开头。
您可以使用以下行检查Data
属性值(在上面的解组代码后添加):
Data
我希望这会有所帮助......
干杯,
杰夫
答案 1 :(得分:0)
这里是JAXB注释的documentation。这应该为您提供足够的信息来确定您需要添加到DataSet
类的注释。
根据文档,这就是您所需要的:
@XmlRootElement(name = "DataSet")
public class DataSet {
public List<Data> data = new ArrayList<Data>();
}
public class Data {
public String DataString;
public String DataValue;
}
我希望人们花更多的时间阅读和理解文档。
答案 2 :(得分:0)
我认为数据不应注释为@XmlRootElement
,因为它不是根元素。
我建议使用基于XJC的工具生成JAXB类,例如Maven JAXB2 Plugin。
答案 3 :(得分:0)
在您的案例中,类应注释如下
@XmlRootElement(name="DataSet")
@XmlAccessorType(XmlAccessType.FIELD)
public class DataSet
{
@XmlElement
private Data[] Data;
public Data[] getData ()
{
return Data;
}
public void setData (Data[] Data)
{
this.Data = Data;
}
@Override
public String toString()
{
return "ClassPojo [Data = "+Data+"]";
}
}
和数据
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Data
{
@XmlAttribute
private String id;
@XmlElement
private String DataString;
@XmlElement
private String DataValue;
public String getId ()
{
return id;
}
public void setId (String id)
{
this.id = id;
}
public String getDataString ()
{
return DataString;
}
public void setDataString (String DataString)
{
this.DataString = DataString;
}
public String getDataValue ()
{
return DataValue;
}
public void setDataValue (String DataValue)
{
this.DataValue = DataValue;
}
@Override
public String toString()
{
return "ClassPojo [id = "+id+", DataString = "+DataString+", DataValue = "+DataValue+"]";
}
}
希望这会有所帮助