我的 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。
我不知道我错在哪里。请帮助
数据集文件如下所示。
@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。 请提供此处需要的注释 提前致谢
最佳答案
以下是如何注释 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“绑定(bind)”。name
属性是可选的,但由于您的 XML 元素名称以大写字母开头,因此必须包含该属性,否则 JAXB 将需要dataSet
和data
作为元素名称。DataString
和DataValue
属性可以使用@XmlElement
进行注释,但这不是必需的,因为 (1) 这是以下情况下的默认行为:不存在注释,并且 (2) Java 属性名称和 XML 元素名称匹配。@XmlAttribute
标识表示为属性而不是子元素的属性,DataSet
的id
属性就是这种情况>。由于 Java 属性名称和 XML 属性名称匹配,因此该注释的name
属性不是必需的。- JAXB 有一个奇怪的行为:它将任何类属性和 getter 视为属性,而不尝试解析属性与其相关 getter 之间的任何基于名称的链接。因此,通过定义标准 getter,它将找到两个
Data
属性、两个id
属性,依此类推。使用@XmlTransient
注释 getter 或属性会禁用将其作为属性处理,这就是我对Data
和DataSet
中的所有 getter 所做的操作。 - 最后,由于
Data
被注释为@XmlRootElement
,因此对它的引用必须用@XmlElementRef
注释,以便 JAXB 正确地可以正确地注释建立属性类型(在DataSet
中)和元素类型(Data
类)之间的链接。
------------ 更新 ------------
抱歉,我对 Data
属性值的了解太快了...您将需要 @XmlElement(name = "DataString")
和 @XmlElement( name = "DataValue")
对应的 Data
属性。这又是因为这些属性名称以大写字母开头。
您可以使用以下行检查您的 Data
属性值(添加在上面的解码代码之后):
Arrays.stream(dataSet.getData()).forEach(System.out::println);
我希望这会有所帮助......
干杯,
杰夫
关于java - 无法将 xml 转换为目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33037150/