引起原因:org.xml.sax.SAXParseException:文件过早结束

时间:2019-09-06 09:39:46

标签: java xml xslt

我正在尝试将一个简单的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>&#xa;</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>&#xa;</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的集成工具时,出现异常错误。

不幸的是,输入文件无法更改。

更新: 尝试发布我的代码时,引号是错误,已更新。

已添加堆栈跟踪

1 个答案:

答案 0 :(得分:0)

修复了此问题:问题是使用者没有获取文件,因此它实际上什么也没做,而是尝试对其进行转换。

相关问题