无法将xml转换为目标文件

时间:2015-10-09 11:28:58

标签: 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。

我不知道我哪里错了。 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提供了这里需要的注释 在此先感谢

4 个答案:

答案 0 :(得分:1)

以下是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的“可绑定”。 name属性是可选的,但由于您的XML元素名称以大写字母开头,因此必须包含该属性,否则JAXB将期望dataSetdata作为元素名称。
  • DataStringDataValue属性可以使用@XmlElement进行注释,但这不是必需的,因为(1)这是没有注释时的默认行为,以及(2) Java属性名称和XML元素名称匹配。
  • @XmlAttribute标识一个属性,表示为属性而不是子元素,id属性为DataSet。由于Java属性名称和XML属性名称匹配,因此不需要此批注的name属性。
  • JAXB有一种奇怪的行为:它将任何类属性和getter视为属性,而不尝试解析属性与其相关getter之间的任何基于名称的链接。因此,在定义了标准getter的情况下,它将找到两个Data属性,两个id属性,依此类推。使用@XmlTransient注释getter或属性会禁用其作为属性的处理,这是我对DataDataSet中所有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+"]";
    }
}

希望这会有所帮助