我正在尝试将一个简单的XML文件转换为CSV文件,当使用显示输出的在线工具时,该部分效果很好。
当我使用基于Java的集成软件通过代码运行文件时,会引发错误;原因:org.xml.sax.SAXParseException:文件的结尾过早。
下面,我包括了输入XML,XSLT和输出(我确定这里不需要显示输出)
我使用XML到CSV的示例作为参考,输出效果很好,我删除了一些不必要的元素/标签,这些元素/标签并没有改变期望的结果
输入:
<?xml version="1.0" encoding="UTF-8"?>
<Results>
<Row>
<soldto>000999900</soldto>
<namelong>long name of company</namelong>
<postcode>po3stc0d3</postcode>
<AltVendDesc>some company name</AltVendDesc>
<prodcode>09060170</prodcode>
<proddescription>productdescriptionhere</proddescription>
<billingdoc>0099999990</billingdoc>
<bdate>20190905</bdate>
<invqty>12</invqty>
<CustPrice>7.3700</CustPrice>
<Gross_inc.batchcharge_>88.4400</Gross_inc.batchcharge_>
<VenProdCode>AA1234</VenProdCode>
</Row>
</Results>
代码:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<?xml-stylesheet type="text/xsl"?>
<xsl:output method="text"/>
<xsl:variable name="delimiter" select="','"/>
<xsl:template match="/">
<tr>
<th style="text-align:Left">soldto</th>
<xsl:value-of select="$delimiter"/>
<th style="text-align:Left">namelong</th>
<xsl:value-of select="$delimiter"/>
<th style="text-align:Left">postcode</th>
<xsl:value-of select="$delimiter"/>
<th style="text-align:Left">AltVendDesc</th>
<xsl:value-of select="$delimiter"/>
<th style="text-align:Left">prodcode</th>
<xsl:value-of select="$delimiter"/>
<th style="text-align:Left">proddescription</th>
<xsl:value-of select="$delimiter"/>
<th style="text-align:Left">billingdoc</th>
<xsl:value-of select="$delimiter"/>
<th style="text-align:Left">bdate</th>
<xsl:value-of select="$delimiter"/>
<th style="text-align:Left">invqty</th>
<xsl:value-of select="$delimiter"/>
<th style="text-align:Left">CustPrice</th>
<xsl:value-of select="$delimiter"/>
<th style="text-align:Left">Gross_inc.batchcharge_</th>
<xsl:value-of select="$delimiter"/>
<th style="text-align:Left">VenProdCode</th>
<xsl:text>
</xsl:text>
</tr>
<xsl:for-each select="Results/Row">
<tr>
<td>
<xsl:value-of select="soldto"/>
<xsl:value-of select="$delimiter"/>
</td>
<td>
<xsl:value-of select="namelong"/>
<xsl:value-of select="$delimiter"/>
</td>
<td>
<xsl:value-of select="postcode"/>
<xsl:value-of select="$delimiter"/>
</td>
<td>
<xsl:value-of select="AltVendDesc"/>
<xsl:value-of select="$delimiter"/>
</td>
<td>
<xsl:value-of select="prodcode"/>
<xsl:value-of select="$delimiter"/>
</td>
<td>
<xsl:value-of select="proddescription"/>
<xsl:value-of select="$delimiter"/>
</td>
<td>
<xsl:value-of select="billingdoc"/>
<xsl:value-of select="$delimiter"/>
</td>
<td>
<xsl:value-of select="bdate"/>
<xsl:value-of select="$delimiter"/>
</td>
<td>
<xsl:value-of select="invqty"/>
<xsl:value-of select="$delimiter"/>
</td>
<td>
<xsl:value-of select="CustPrice"/>
<xsl:value-of select="$delimiter"/>
</td>
<td>
<xsl:value-of select="Gross_inc.batchcharge_"/>
<xsl:value-of select="$delimiter"/>
</td>
<td>
<xsl:value-of select="VenProdCode"/>
</td>
<xsl:text>
</xsl:text>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
输出为:
soldto,namelong,postcode,AltVendDesc,prodcode,proddescription,billingdoc,bdate,invqty,CustPrice,Gross_inc.batchcharge_,VenProdCode
000999900,long name of company,po3stc0d3,some company name,09060170,productdescriptionhere,0099999990,20190905,12,7.3700,88.4400,AA1234
堆栈跟踪:
2019-09-06T10:39:35,584 DEBUG [Transform_customer_Data@Consume from database] [com.adaptris.core.StandardWorkflow] handling bad message
2019-09-06T10:39:35,585 DEBUG [Transform_customer_Data@Consume from database] [com.adaptris.core.FixedIntervalPoller] time to process [1] messages [8] ms
2019-09-06T10:39:55,587 DEBUG [Transform_customer_Data@Consume from database] [com.adaptris.core.StandardWorkflow] start processing msg [DefaultAdaptrisMessageImp[uniqueId=5225a706-fe60-433b-9b42-dccc1f5f4673,metadata=[]]]
2019-09-06T10:39:55,588 DEBUG [Transform_customer_Data@Consume from database] [com.adaptris.core.ServiceList] Executing doService on [XmlTransformService(Transform_Data)]
2019-09-06T10:39:55,589 DEBUG [Transform_customer_Data@Consume from database] [com.adaptris.core.transform.XmlTransformService] using URL [./XSLT/transform.XSLT]
2019-09-06T10:39:55,591 ERROR [Transform_customer_Data@Consume from database] [com.adaptris.core.StandardWorkflow] Exception from ServiceCollection
com.adaptris.core.ServiceException: failed to transform message
at com.adaptris.core.transform.XmlTransformService.doTransform(XmlTransformService.java:190) ~[interlok-core.jar!/:3.9.0-RELEASE]
at com.adaptris.core.transform.XmlTransformService.doService(XmlTransformService.java:127) ~[interlok-core.jar!/:3.9.0-RELEASE]
at com.adaptris.core.ServiceList.applyServices(ServiceList.java:99) ~[interlok-core.jar!/:3.9.0-RELEASE]
at com.adaptris.core.ServiceCollectionImp.doService(ServiceCollectionImp.java:198) ~[interlok-core.jar!/:3.9.0-RELEASE]
at com.adaptris.core.StandardWorkflow.handleMessage(StandardWorkflow.java:90) [interlok-core.jar!/:3.9.0-RELEASE]
at com.adaptris.core.StandardWorkflow.onAdaptrisMessage(StandardWorkflow.java:66) [interlok-core.jar!/:3.9.0-RELEASE]
at com.adaptris.core.PollingTrigger.processMessages(PollingTrigger.java:91) [interlok-core.jar!/:3.9.0-RELEASE]
at com.adaptris.core.PollerImp.processMessages(PollerImp.java:74) [interlok-core.jar!/:3.9.0-RELEASE]
at com.adaptris.core.FixedIntervalPoller$PollerTask.run(FixedIntervalPoller.java:60) [interlok-core.jar!/:3.9.0-RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_211]
at java.util.concurrent.FutureTask.runAndReset(Unknown Source) [?:1.8.0_211]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Source) [?:1.8.0_211]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) [?:1.8.0_211]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:1.8.0_211]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:1.8.0_211]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_211]
Caused by: org.xml.sax.SAXParseException: Premature end of file.
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source) ~[xercesImpl.jar!/:?]
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source) ~[xercesImpl.jar!/:?]
at com.adaptris.util.text.xml.XmlTransformer.createSource(XmlTransformer.java:161) ~[interlok-core.jar!/:3.9.0-RELEASE]
at com.adaptris.util.text.xml.XmlTransformer.createSource(XmlTransformer.java:153) ~[interlok-core.jar!/:3.9.0-RELEASE]
at com.adaptris.util.text.xml.XmlTransformer.transform(XmlTransformer.java:95) ~[interlok-core.jar!/:3.9.0-RELEASE]
at com.adaptris.core.transform.XmlTransformService.doTransform(XmlTransformService.java:184) ~[interlok-core.jar!/:3.9.0-RELEASE]
正如我之前所说,这很好,但是当通过使用Java的集成工具时,出现异常错误。
不幸的是,输入文件无法更改。
更新: 尝试发布我的代码时,引号是错误,已更新。
已添加堆栈跟踪
答案 0 :(得分:0)
修复了此问题:问题是使用者没有获取文件,因此它实际上什么也没做,而是尝试对其进行转换。