Jasper Report:文档根元素“jasperReport”,必须匹配DOCTYPE根“null”

我使用iReport版本(4.7.1)设计了jasper报告。 通过iReport它工作正常。 当我从java servlet调用时,出现错误:

 Error : `Document root element "jasperReport", must match DOCTYPE root "null".` net.sf.jasperreports.engine.JRException: Document root element "jasperReport", must match DOCTYPE root "null". at net.sf.jasperreports.engine.xml.JRXmlLoader.loadXML(JRXmlLoader.java:242) at net.sf.jasperreports.engine.xml.JRXmlLoader.loadXML(JRXmlLoader.java:225) at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:213) at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:167) at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:151) at com.crmreport.controller.ReportServlet.processRequest(ReportServlet.java:124) at com.crmreport.controller.ReportServlet.doPost(ReportServlet.java:505) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:877) at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:594) at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:165) at java.lang.Thread.run(Thread.java:619) Caused by: org.xml.sax.SAXParseException: Document root element "jasperReport",must match DOCTYPE root "null". at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(Err orHandlerWrapper.java:131) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError( XMLErrorReporter.java:384) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError( XMLErrorReporter.java:318) at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.rootEleme ntSpecified(XMLDTDValidator.java:1621) at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleSta rtElement(XMLDTDValidator.java:1900) at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElem ent(XMLDTDValidator.java:764) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp l.scanStartElement(XMLDocumentFragmentScannerImpl.java:1357) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$Conten tDriver.scanRootElementHook(XMLDocumentScannerImpl.java:1289) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp l$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3084) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$Prolog Driver.next(XMLDocumentScannerImpl.java:912) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(X MLDocumentScannerImpl.java:645) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp l.scanDocument(XMLDocumentFragmentScannerImpl.java:508) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(X ML11Configuration.java:807) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(X ML11Configuration.java:737) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser. java:107) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Ab stractSAXParser.java:1205) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.p arse(SAXParserImpl.java:522) at org.apache.commons.digester.Digester.parse(Digester.java:1745) at net.sf.jasperreports.engine.xml.JRXmlLoader.loadXML(JRXmlLoader.java: 238) 

这是我的JRXML文件:

                           $P{dateFrom} AND CalledDate                                                          <font />       <font size="22" />          <font size="12" />        <font />       <font />       <font />       <font />       <font />                                <font />       <font />                                                                                                                                                                          

这是我运行的:

  JasperReport jasperReport = null; JasperDesign jasperDesign = null; Map parameters = new HashMap(); parameters.put("dateFrom", dateFrom); parameters.put("dateTo", dateTo); String path = getServletContext().getRealPath("/WEB-INF/"); System.out.println("==Path==" + path); String filePath = path+"\\classes\\com\\crmreport\\controller\\BusinessUnitDetail.jrxml"; System.out.println("==filePath==" + filePath); jasperDesign = JRXmlLoader.load(filePath); jasperReport = JasperCompileManager.compileReport(jasperDesign); byte[] byteStream = JasperRunManager.runReportToPdf(jasperReport, parameters, new JREmptyDataSource()); OutputStream outStream = response.getOutputStream(); response.setHeader("Content-Disposition","inline, filename=BusinessUnitDetail.pdf"); response.setContentType("application/pdf"); response.setContentLength(byteStream.length); outStream.write(byteStream,0,byteStream.length); 

是什么导致这些错误? 我用谷歌搜索它,它说错误是在XML上。 但它使用iReport进行了罚款。

假设jrxml文件已添加到您的jar文件中,您应该像这样加载它:

 InputStream is = ReportServlet.class.getResourceAsStream(themeDesignName); jasperDesign = JRXmlLoader.load(is); 

早期版本的JasperReport使用DOCTYPE。 较新的版本使用XMLNS。 当您打开.JRXML时,iReport使用XMLNS保存它并删除了文档开头的先前DOCTYPE标记。 更新您的Jasper JARS版本,或将JRXML保存为旧版本。