java - java SAXParser 忽略异常并继续解析
问题描述
我有一个解析 xml 文件并将其内容写入 MySQL 的 java 类。一切正常,但问题是当 xml 文件包含无效的 unicode 字符时,会引发异常并且程序停止解析文件。
我的提供商每天都会发送此 xml 文件,其中包含产品列表及其价格、数量等,我无法控制这一点,因此无效字符将始终存在。
我要做的就是捕捉这些错误,忽略它们并继续解析 xml 文件的其余部分。
我在 SAXHandler 类的和方法上添加了 try-catch 语句startElement
,但是,它们不会捕获任何异常,并且只要解析器发现无效字符,就会停止执行。endElement
characters
看来我只能从调用解析器的函数中捕获这些异常:
try {
myIS = new FileInputStream(xmlFilePath);
parser.parse(myIS, handler);
retValue = true;
} catch(SAXParseException err) {
System.out.println("SAXParseException " + err);
}
但是,在我的情况下这是没有用的,即使异常告诉我无效字符在哪里,执行也会停止,因此产品列表远未完成。该列表大约有 8,000 个产品,并且只有几个无效字符,但是,如果无效字符在前 100 个产品中,则数据库中不会更新所有 7,900 个产品。我还注意到,endDocument
如果发生异常,则不会调用该方法。
几年前有人在这里问过同样的问题,但没有得到任何解决方案。
我真的很感激任何想法或解决方法。
数据样本(根据要求):
<Producto>
<Brand>
<Description>Epson</Description>
<ManufacturerId>eps</ManufacturerId>
<BrandId>eps</BrandId>
</Brand>
<New>false</New>
<OnSale>null</OnSale>
<Type>Physical</Type>
<Description>Epson TM T88V - Impresora de recibos - línea térmica - rollo 8 cm - hasta 300 mm/segundo - paralelo, USB</Description>
<Category>
<CategoryId>pos</CategoryId>
<Description>Puntos de Venta</Description>
<Subcategories>
<CategoryId>pos.printer</CategoryId>
<Description>Impresoras para Recibos</Description>
</Subcategories>
</Category>
<InStock>0</InStock>
<Price>
<UnitPrice>4865.6042</UnitPrice>
<CurrencyId>MXN</CurrencyId>
</Price>
<Manufacturer>
<Description>Epson</Description>
<ManufacturerId>eps</ManufacturerId>
</Manufacturer>
<Mpn>C31CA85814</Mpn>
<Sku>PT910EPS27</Sku>
<CompilationDate>2020-02-25T12:30:14.6607135Z</CompilationDate>
</Producto>
解决方案
我解决了它在处理之前删除了 xml 文件的无效字符。
我无法做我想做的事情(导管错误并继续),但这种解决方法有效。
推荐阅读
- perforce - 如何 p4 搁置多个文件
- tfs - TFS REST API - 搜索
- ruby-on-rails - 如何为rails中的列设置一些默认值?
- javascript - 键盘避免视图 - React-Native?
- javascript - 反应内存泄漏
- jquery - jquery each 总是对它进行排序,希望它未排序
- unity3d - 如何修复变换不存在 Unity
- sql - 如何从 SQL 的列中删除垃圾字符 {{3*3}} ${3*3} <%= 3*3 %>?
- javascript - 将 fetch 调用的响应(对象)存储到对象数组中
- java - 使用弹簧数据混淆休眠行为