我正在使用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();
}
}
错误讯息..
文件BugReport.xml
从上面的屏幕截图中可以看到,正在生成文件BugReport.xml但它是空的..
答案 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命名约定来执行此操作,则不遵守这些约定的代码可能会失败。