java - 无法将 xml 转换为目标文件

标签 java xml jaxb2

我的 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。 请提供此处需要的注释 提前致谢

最佳答案

以下是如何注释 DataSetData 类:

@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 将需要 dataSetdata 作为元素名称。
  • DataStringDataValue 属性可以使用 @XmlElement 进行注释,但这不是必需的,因为 (1) 这是以下情况下的默认行为:不存在注释,并且 (2) Java 属性名称和 XML 元素名称匹配。
  • @XmlAttribute 标识表示为属性而不是子元素的属性,DataSetid 属性就是这种情况>。由于 Java 属性名称和 XML 属性名称匹配,因此该注释的 name 属性不是必需的。
  • JAXB 有一个奇怪的行为:它将任何类属性和 getter 视为属性,而不尝试解析属性与其相关 getter 之间的任何基于名称的链接。因此,通过定义标准 getter,它将找到两个 Data 属性、两个 id 属性,依此类推。使用 @XmlTransient 注释 getter 或属性会禁用将其作为属性处理,这就是我对 DataDataSet 中的所有 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/

相关文章:

java - 如何计算 64 位 Java 内存成本

xml - 使用 XQuery/XPath 获取祖先节点的逆序

java - Jaxb2Marshaller 如何保存 JAXBContext

java - 配置多态对象集合以在 JAXB2 中工作

web-services - 在执行 JAXB 解码时处理无效的枚举值

java - 将 int 值拆分为单独的数字

java - 开闭原则和违反封装性

Java 实例化异常

xml - XML 数据类型方法 "value"的参数 1 必须是字符串文字

java - 创建动态地与 UI 中的数据对话的 XML