【发布时间】:2019-07-18 23:30:05
【问题描述】:
我有一个处理 XML 文件以读取一些值的 Java 代码。我收到一个错误:Invalid UTF8 encoding,我试图将文件内容复制到 NotePad++ 上的另一个文件中,该过程运行良好,但如果我只将文件另存为其他名称,则会给出相同的错误. 抱歉,我不能把我的 XML 文件放在这里,因为它太大了,我只会放 header 和 trailer。 感谢您提供任何帮助来解决此错误。 我处理 xml 文件的 java 代码:
XPathFactory f=XPathFactory.newInstance();
XPath x=f.newXPath();
InputSource source=new InputSource(new FileInputStream("C:\\Users\\cc\\eclipse-workspace\\data\\file.xml") );
InputSource source2=new InputSource(new FileInputStream("C:\\Users\\cc\\eclipse-workspace\\data\\file.xml") );
XPathExpression trlr=x.compile("pers/trailer/text()");
XPathExpression hdr=x.compile("pers/header/CD/text()");
String s=trlr.evaluate(source);
String s2=hdr.evaluate(source2);
System.out.println("header :"+s+" trailer"+s2);
pers 是 xml 文件中的根标签:
XML 文件如下所示:
<?xml version = '1.0' encoding = 'UTF-8'?>
<pers>
<header>555</header>
.
.
.
.
<trailer>666</trailer>
</pers>
堆栈跟踪:
java.io.UTFDataFormatException: Invalid UTF8 encoding.
at oracle.xml.parser.v2.XMLUTF8Reader.checkUTF8Byte(XMLUTF8Reader.java:229)
at oracle.xml.parser.v2.XMLUTF8Reader.readUTF8Char(XMLUTF8Reader.java:274)
at oracle.xml.parser.v2.XMLUTF8Reader.fillBuffer(XMLUTF8Reader.java:189)
at oracle.xml.parser.v2.XMLByteReader.saveBuffer(XMLByteReader.java:452)
at oracle.xml.parser.v2.XMLReader.fillBuffer(XMLReader.java:2776)
at oracle.xml.parser.v2.XMLReader.scanNameChars(XMLReader.java:1352)
at oracle.xml.parser.v2.XMLReader.readQName(XMLReader.java:2149)
at oracle.xml.parser.v2.NonValidatingParser.parseElement(NonValidatingParser.java:1579)
at oracle.xml.parser.v2.NonValidatingParser.parseRootElement(NonValidatingParser.java:448)
at oracle.xml.parser.v2.NonValidatingParser.parseDocument(NonValidatingParser.java:394)
at oracle.xml.parser.v2.XMLParser.parse(XMLParser.java:236)
at oracle.xml.jaxp.JXDocumentBuilder.parse(JXDocumentBuilder.java:175)
at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:302)
at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:332)
at tasklets.HeaderFooter.execute(HeaderFooter.java:39)
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:406)
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:330)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:272)
at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:81)
at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:374)
at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:257)
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:200)
at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:148)
at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64)
at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:67)
at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:169)
at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:144)
at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:134)
at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:306)
at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:135)
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:128)
at main.IncomeResponseFile.main(IncomeResponseFile.java:39)
--------------- linked to ------------------
javax.xml.xpath.XPathExpressionException: java.io.UTFDataFormatException: Invalid UTF8 encoding.
at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:305)
at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:332)
at tasklets.HeaderFooter.execute(HeaderFooter.java:39)
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:406)
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:330)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:272)
at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:81)
at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:374)
at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:257)
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:200)
at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:148)
at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64)
at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:67)
at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:169)
at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:144)
at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:134)
at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:306)
at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:135)
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:128)
at main.IncomeResponseFile.main(IncomeResponseFile.java:39)
Caused by: java.io.UTFDataFormatException: Invalid UTF8 encoding.
at oracle.xml.parser.v2.XMLUTF8Reader.checkUTF8Byte(XMLUTF8Reader.java:229)
at oracle.xml.parser.v2.XMLUTF8Reader.readUTF8Char(XMLUTF8Reader.java:274)
at oracle.xml.parser.v2.XMLUTF8Reader.fillBuffer(XMLUTF8Reader.java:189)
at oracle.xml.parser.v2.XMLByteReader.saveBuffer(XMLByteReader.java:452)
at oracle.xml.parser.v2.XMLReader.fillBuffer(XMLReader.java:2776)
at oracle.xml.parser.v2.XMLReader.scanNameChars(XMLReader.java:1352)
at oracle.xml.parser.v2.XMLReader.readQName(XMLReader.java:2149)
at oracle.xml.parser.v2.NonValidatingParser.parseElement(NonValidatingParser.java:1579)
at oracle.xml.parser.v2.NonValidatingParser.parseRootElement(NonValidatingParser.java:448)
at oracle.xml.parser.v2.NonValidatingParser.parseDocument(NonValidatingParser.java:394)
at oracle.xml.parser.v2.XMLParser.parse(XMLParser.java:236)
at oracle.xml.jaxp.JXDocumentBuilder.parse(JXDocumentBuilder.java:175)
at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:302)
... 23 more
【问题讨论】:
-
文件真的是UTF-8吗?有什么特殊字符吗?
-
我建议也发布堆栈跟踪。也许您有一些来自非 unicode 源的扩展字符,并且在将文本粘贴到 np++ 并保存新文件时以某种方式进行了转换?
-
@Mena ,我更新了堆栈跟踪
-
@ piet.t ,很难说,该文件有大约 100 000 条记录(每条记录),每条记录有 100 个字段,即数字和字符串。
-
没有什么是容易的,但我想你必须找到那个有问题的字符并通过十六进制编辑器检查它的编码。并始终牢记:仅仅因为 xml 文件在其标头中声称是 UTF-8,这不一定是正确的。
标签: java xml xslt spring-batch