使用JAXB将Java对象编组为XML

时间:2014-07-14 06:55:38

标签: java xml jaxb marshalling

我正在使用JAXB将Java对象编组为XML。我正在使用的ide是Windows OS中的JDeveloper 11.1.1.7.0。每当我运行特定的java代码时,我会收到一条错误消息,上面写着

"Error(1,1): file:/C:/JDeveloper/mywork/bugdashboard/Model/src/model/BugReport.xml<Line 1, Column 1>: XML-20108: (Fatal Error) Start of root element expected."

即使代码中似乎没有错误仍然无法获得所需的输出..请帮助..

我的JAVA代码..

     package model;


     import java.io.File;

     import java.util.ArrayList;
     import java.util.List;
     import javax.xml.bind.JAXBContext;
     import javax.xml.bind.JAXBException;
     import javax.xml.bind.Marshaller;


     public class JavaObvjecttoXml {



     public void xmlGenerator() {

    //super();
    JavaServiceFacade fcd = new JavaServiceFacade();
    bugvalue track, track1, track2;
    List<ReportDto> bugReport, bugrePort1, bugrePort2;
    List<bugvalue> reportMetaData= new ArrayList<bugvalue>();    
    ReportMetaData rmd = new ReportMetaData();



    try {
        rmd.setBugreportmetadata(new ArrayList<bugvalue> ());
        JAXBContext context = JAXBContext.newInstance(ReportMetaData.class);

        Marshaller marshaller;
        marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        track = new bugvalue();
        bugReport = fcd.getBugSeverityReport();
        track.setBugReport(bugReport);
        track.setLabel("Bug by severity");
        track.setTile("severity");
        track.setChatType("PIE");
        track.setXAxisLabel("Label");
        track.setYAxisLAbel("Label Count");

        track1 = new bugvalue();
        bugrePort1 = fcd.getBugStatusReport();
        track1.setBugReport(bugrePort1);
        track1.setLabel("Bug by Status");
        track1.setTile("status");
        track1.setChatType("bar");
        track1.setXAxisLabel("count");
        track1.setYAxisLAbel("Label");

        track2 = new bugvalue();
        bugrePort2 = fcd.getBugCategoryReport();
        track2.setBugReport(bugrePort2);
        track2.setLabel("Bug by Category");
        track2.setTile("category");
        track2.setChatType("PIE");
        track2.setXAxisLabel("count");
        track2.setYAxisLAbel("Label"); 

        reportMetaData.add(track);
        reportMetaData.add(track1);
        reportMetaData.add(track2);
        rmd.setBugreportmetadata(reportMetaData);
        File output = new File("C:\\JDeveloper\\mywork\\bugdashboard\\Model\\src\\model\\BugReport.xml");
        marshaller.marshal(rmd, output);

        }
    catch(JAXBException e){
        e.printStackTrace();

    }







    }


     /**
     * @param args
     */

     public static void main(String[] args) {

    JavaObvjecttoXml obj = new JavaObvjecttoXml();
       obj.xmlGenerator(); 
   }


  }

文件ReportMetaData.java

    package model;

    import java.util.ArrayList;
    import java.util.List;
    import javax.xml.bind.annotation.XmlRootElement;

    @ XmlRootElement(name = "ReportMetaData")

    public class ReportMetaData {

    private List<bugvalue> bugreportmetadata = new ArrayList<bugvalue>();

    public List<bugvalue> getBugreportmetadata() {
      return bugreportmetadata;
    }

    */ @param bugreportmetadata
    */
    public void setBugreportmetadata(List<bugvalue> bugreportmetadata) {
       this.bugreportmetadata = bugreportmetadata;
    }

     public ReportMetaData() {
    super();
    }
    }

错误讯息..

error

文件BugReport.xml

xml

从上面的屏幕截图中可以看到,正在生成文件BugReport.xml但它是空的..

1 个答案:

答案 0 :(得分:0)

我怀疑当您将对象设置为XML时,需要注释要输出的字段。我使用的JAX-B模式编译器生成的Java™源将以下注释应用于对象属性定义:

@XmlElement(required = true)

在这种情况下,ReportMetaData类的相关部分如下所示:

@XmlElement(required = true)
private List<bugvalue> bugreportmetadata = new ArrayList<bugvalue>();

JAX-B模式编译器还会在@XmlRootElement注释之前生成两个额外的注释:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
   "bugreportmetadata"
})

在JAX-B生成的类结构中,每个类定义都有这些注释。此外,嵌套类定义的@XmlType注释包含类型的名称,因此bugvalue类的注释可能如下所示:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "bugvalue", propOrder = {
  // TODO: list the fields for BugValue as defined
})

bugvalval的全小写定义,取决于JAX-B编组器的编码,也可能产生问题。在编组对象时,JAX-B处理器必须动态访问和定义类,并从中生成元素标识符。如果JAX-B处理器依赖于Java命名约定来执行此操作,则不遵守这些约定的代码可能会失败。