java – 验证XML文档导致“1字节UTF-8序列的无效字节1”.
我使用
Probatron4j在内部使用Saxon来验证
Schematron样式表中的一些XML文件.大多数情况下,这工作正常,但偶尔,处理崩溃与错误
我的研究表明,这条消息通常表明(没有特别的顺序) >公然无效的数据(例如,尝试读取ZIP文件,就像它是XML文件一样); 这些都不适用于我正在处理的文件.我在程序执行期间检查了字节数组形式的输入,它不包含BOM或任何非ASCII字符. 处理通过我的30kb文档的大约五分之一,然后崩溃在一个不起眼的英语句子上(“不起眼”,我的意思是所有字节都在32(空格)和122(小写z)之间;换句话说,标准键盘字符).假定有问题的元素的字节在这篇文章的末尾. 奇怪的是,失败的文档是通过从较大的文档中删除一些元素来生成的,这些元素被相同的代码干净地处理. 我知道异常是在实现org.xml.saxXMLReader接口的对象的parse(InputSource input)方法中抛出的.根据the Javadoc,SAXException表示
检查调试器中的异常表明没有包装异常. 可能导致此错误的原因是什么? 编辑: [60,80,97,114,103,112,104,62,69,120,101,99,117,116,105,118,32,83,109,121,58,70,111,49,55,53,52,54,51,13,10,110,100,65,115,119,102,108,98,44,75,71,73,76,88,86,46,107,89,39,87,59,78,60,47,62] 在第三次出现109之后抛出异常. 解决方法
我已经解决了这个问题.尽管Java在其内部使用UTF-8作为其String对象,但String类的getBytes()方法将以系统的默认编码生成字节,除非您明确指定您需要UTF-8(或其理解的其他编码方案).
我不完全确定这是如何或为什么解决这个问题,因为抛出异常的地点附近的字节 – 问题末尾的字节 – 本身都是有效的UTF-8字节,但看起来确实如此有固定的东西. 我可以想到的唯一可能的原因是我错过了文件中较早的无效字节,这使得事情搞砸了但并没有导致立即崩溃.我正在从ByteArrayInputStream中读取字节,因此程序可能会同时从缓冲区中读取一个大块,这会将pos标记设置为超出假设的坏字符所在位置的位置. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |