【发布时间】:2020-03-03 20:11:42
【问题描述】:
我有一个解析 xml 文件并将其内容写入 MySQL 的 java 类。一切正常,但问题是当 xml 文件包含无效的 unicode 字符时,会引发异常并且程序停止解析文件。
我的提供商每天都会发送此 xml 文件,其中包含产品列表及其价格、数量等,我无法控制,因此无效字符将始终存在。
我要做的就是捕捉这些错误,忽略它们并继续解析 xml 文件的其余部分。
我在 SAXHandler 类的 startElement、endElement 和 characters 方法上添加了 try-catch 语句,但是,它们不会捕获任何异常,并且每当解析器发现无效时执行就会停止字符。
看来我只能从调用解析器的函数中捕获这些异常:
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>
【问题讨论】:
-
您能否提供错误消息以及您的数据样本?
-
错误信息说:org.xml.sax.SAXParseException;行号:1365;列号:413;在文档的元素内容中发现无效的 XML 字符 (Unicode: 0x1)。
-
如果在解析文件之前运行它并删除所有无效字符会怎样?像这样stackoverflow.com/questions/45009271/…
-
这正是我所做的,非常感谢!!