如何在JasperReports库中使用Xmldatasource调试XPath处理

发布于 2025-02-13 03:04:37 字数 3497 浏览 1 评论 0原文

如您所见,这是Jasperreports的记录问题。我正在尝试使用JasperReports库从XML文件生成PDF报告(此处没有服务器产品)。在使用IrePort设计报告后,我执行以下Java语句:

JasperRunManager.runReportToPdfFile("bin/EstateAccountingMonthly.jasper",
                                    m_outputPdfFileName,
                                    parameters,
                                    xmlDataSource);

此语句将磨碎约30秒,没有例外,对日志文件写得很少,并产生一个一页空的PDF文件。参数XMLDATASOURCE引用XML文件,其结构与报告中包含的XPATH表达式不匹配。这是因为XML文件的架构更改了,而没有反映Jasper报告文件中的这些更改(即.jrxml文件)。因此,我不希望获得一个好的报告(或任何报告)。但是我期望的是,贾斯珀告诉我,在针对XML流的报告生产期间,各种XPath表情都在失败。但是贾斯珀什么也没报告(在日志文件中,该文件已配置为记录所有事件)。

我不知道如何配置jasper来报告XPath表达评估的尝试和结果。我最终做了一些拼命的事情(不起作用):通过jasper jar文件梳理,寻找的类表明,它可能会生成我要寻找的日志记录的类型,然后将这些类合并到log4j中。属性文件:

# Extra logging related to initialization of Log4j
# Set to debug or trace if log4j initialization is failing
status = all
# Name of the configuration
name = ConsoleLogConfigDemo

# Console appender configuration
appender.console.type = Console
appender.console.name = consoleLogger
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Root logger level
rootLogger.level = all
# Root logger referring to console appender
rootLogger.appenderRef.stdout.ref = consoleLogger

# The following are my best guesses for which classes should be enabled for logging.

logger.net_sf_jasperreports_engine_data_jrxmldatasource.name=net.sf.jasperreports.engine.data.jrxmldatasource
logger.net_sf_jasperreports_engine_data_jrxmldatasource.level=ALL
logger.net_sf_jasperreports_engine_data_jrxmldatasource.appenderRef.stdout.ref = consoleLogger

logger.net_sf_jasperreports_data_xml_XmlDataAdapterImpl.name=net.sf_jasperreports.data.xml.XmlDataAdapterImpl
logger.net_sf_jasperreports_data_xml_XmlDataAdapterImpl.level=ALL
logger.net_sf_jasperreports_data_xml_XmlDataAdapterImpl.appenderRef.stdout.ref = consoleLogger

logger.net_sf_jasperreports_engine_util_xml_JRXPathExecuter.name=net.sf.jasperreports.engine.util.xml.JRXPathExecuter
logger.net_sf_jasperreports_engine_util_xml_JRXPathExecuter.level=ALL
logger.net_sf_jasperreports_engine_util_xml_JRXPathExecuter.appenderRef.stdout.ref = consoleLogger

logger.net_sf_jasperreports_engine_util_xml_XalanXPathExecuter.name=net.sf.jasperreports.engine.util.xml.XalanXPathExecuter
logger.net_sf_jasperreports_engine_util_xml_XalanXPathExecuter.level=ALL
logger.net_sf_jasperreports_engine_util_xml_XalanXPathExecuter.appenderRef.stdout.ref = consoleLogger

logger.net_sf_jasperreports_engine_query_XalanXPathQueryExecuter.name=net.sf.jasperreports.engine.query.XalanXPathQueryExecuter
logger.net_sf_jasperreports_engine_query_XalanXPathQueryExecuter.level=ALL
logger.net_sf_jasperreports_engine_query_XalanXPathQueryExecuter.appenderRef.stdout.ref = consoleLogger

logger.net_sf_jasperreports_engine_util_xml_JRXPathExecuterUtils.name=net.sf.jasperreports.engine.util.xml.JRXPathExecuterUtils
logger.net_sf_jasperreports_engine_util_xml_JRXPathExecuterUtils.level=ALL
logger.net_sf_jasperreports_engine_util_xml_JRXPathExecuterUtils.appenderRef.stdout.ref = consoleLogger

logger.net_sf_jasperreports_engine_query_JRXPathQueryExecuter.name=net.sf.jasperreports.engine.query.JRXPathQueryExecuter
logger.net_sf_jasperreports_engine_query_JRXPathQueryExecuter.level=ALL
logger.net_sf_jasperreports_engine_query_JRXPathQueryExecuter.appenderRef.stdout.ref = consoleLogger

但这不会导致XPath评估的记录。如何调试XPath评估?

As you will see, this is a Jasperreports logging question. I am trying to generate a PDF report from an XML file using Jasperreports Library (so no server products here). After designing a report using iReport I execute the following Java statement:

JasperRunManager.runReportToPdfFile("bin/EstateAccountingMonthly.jasper",
                                    m_outputPdfFileName,
                                    parameters,
                                    xmlDataSource);

This statement grinds away for about 30 seconds, produces no exceptions, writes very little to the log file and produces a one page empty PDF file. The parameter xmlDataSource references an XML file whose structure DOES NOT match the XPath expressions contained in the report. This is because the schema of the XML file changed without reflecting those changes in the Jasper report files (i.e. the .JRXML files). So I'm not expecting to get a good report (or any report). But what I was expecting was Jasper telling me that various XPath expressions were failing during the production of the report against the XML stream. But Jasper reported nothing (in the log file, which is configured to log ALL events).

I don't know how to configure Jasper to report the attempts and results of XPath expression evaluations. I wound up doing something desperate (which didn't work): combing through the Jasper jar file looking for classes whose name suggests it might generate the type of logging I'm looking for and then incorporating those classes in the log4j.properties file:

# Extra logging related to initialization of Log4j
# Set to debug or trace if log4j initialization is failing
status = all
# Name of the configuration
name = ConsoleLogConfigDemo

# Console appender configuration
appender.console.type = Console
appender.console.name = consoleLogger
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Root logger level
rootLogger.level = all
# Root logger referring to console appender
rootLogger.appenderRef.stdout.ref = consoleLogger

# The following are my best guesses for which classes should be enabled for logging.

logger.net_sf_jasperreports_engine_data_jrxmldatasource.name=net.sf.jasperreports.engine.data.jrxmldatasource
logger.net_sf_jasperreports_engine_data_jrxmldatasource.level=ALL
logger.net_sf_jasperreports_engine_data_jrxmldatasource.appenderRef.stdout.ref = consoleLogger

logger.net_sf_jasperreports_data_xml_XmlDataAdapterImpl.name=net.sf_jasperreports.data.xml.XmlDataAdapterImpl
logger.net_sf_jasperreports_data_xml_XmlDataAdapterImpl.level=ALL
logger.net_sf_jasperreports_data_xml_XmlDataAdapterImpl.appenderRef.stdout.ref = consoleLogger

logger.net_sf_jasperreports_engine_util_xml_JRXPathExecuter.name=net.sf.jasperreports.engine.util.xml.JRXPathExecuter
logger.net_sf_jasperreports_engine_util_xml_JRXPathExecuter.level=ALL
logger.net_sf_jasperreports_engine_util_xml_JRXPathExecuter.appenderRef.stdout.ref = consoleLogger

logger.net_sf_jasperreports_engine_util_xml_XalanXPathExecuter.name=net.sf.jasperreports.engine.util.xml.XalanXPathExecuter
logger.net_sf_jasperreports_engine_util_xml_XalanXPathExecuter.level=ALL
logger.net_sf_jasperreports_engine_util_xml_XalanXPathExecuter.appenderRef.stdout.ref = consoleLogger

logger.net_sf_jasperreports_engine_query_XalanXPathQueryExecuter.name=net.sf.jasperreports.engine.query.XalanXPathQueryExecuter
logger.net_sf_jasperreports_engine_query_XalanXPathQueryExecuter.level=ALL
logger.net_sf_jasperreports_engine_query_XalanXPathQueryExecuter.appenderRef.stdout.ref = consoleLogger

logger.net_sf_jasperreports_engine_util_xml_JRXPathExecuterUtils.name=net.sf.jasperreports.engine.util.xml.JRXPathExecuterUtils
logger.net_sf_jasperreports_engine_util_xml_JRXPathExecuterUtils.level=ALL
logger.net_sf_jasperreports_engine_util_xml_JRXPathExecuterUtils.appenderRef.stdout.ref = consoleLogger

logger.net_sf_jasperreports_engine_query_JRXPathQueryExecuter.name=net.sf.jasperreports.engine.query.JRXPathQueryExecuter
logger.net_sf_jasperreports_engine_query_JRXPathQueryExecuter.level=ALL
logger.net_sf_jasperreports_engine_query_JRXPathQueryExecuter.appenderRef.stdout.ref = consoleLogger

But this did not cause logging of XPath evaluations to occur. How do I debug XPath evaluations?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夏了南城 2025-02-20 03:04:37

可能值得考虑的是,当Xpath处理器评估XPath表达并返回空的结果时,从XPath处理器的角度来看,这并不是“失败”。那是一个成功。 “失败”是XPath表达式无效的时候,但是这些表达式都是有效的。

我怀疑您可能会通过获取XML输入,从报告中收集这些XPath表达方式,然后在外部工具中调试它们,例如Web浏览器的控制台或诸如 https://www.freeformatter.com/xpath-tester.html https://martin-honnen.github.io/xpath31fiddle/

It's probably worth considering that when an XPath processor evaluates an XPath expression and returns an empty result, that's not a "failure" from the point of view of the XPath processor; that's a success. A "failure" is when the XPath expression is invalid, but of course these expressions are all valid.

I suspect that you will probably have more luck by taking the XML input, collecting these XPath expressions from the report, and then debugging them in an external tool, such as a web browser's console, or a website like https://www.freeformatter.com/xpath-tester.html or https://martin-honnen.github.io/xpath31fiddle/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文