gpt4 book ai didi

java SAXParser 忽略异常并继续解析

转载 作者:行者123 更新时间:2023-12-01 18:08:21 29 4
gpt4 key购买 nike

我有一个java类,它解析xml文件,并将其内容写入MySQL。一切正常,但问题是当 xml 文件包含无效的 unicode 字符时,会引发异常并且程序停止解析文件。

我的提供商每天都会发送此 xml 文件,其中包含产品列表及其价格、数量等。我无法控制这一点,因此无效字符将始终存在。

我想做的就是捕获这些错误,忽略它们并继续解析 xml 文件的其余部分。

我在 SAXHandler 类的 startElementendElementcharacters 方法上添加了 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>

最佳答案

XML 的理念是不处理不良数据。如果它不是格式良好的 XML,则解析器应该放弃,用户应用程序也应该放弃。从文化上来说,这是对 HTML 文化的一种 react ,人们发现,如果普遍预期数据用户会容忍不良数据,那么结果就是供应商会产生不良数据。

标准可以降低成本,因为您可以使用现成的工具来创建有效数据并在另一端读取数据。如果您决定要交换几乎是 XML 但又不完全是 XML 的内容,那么这些好处就完全抵消了。如果您正在下载软件,如果它不能编译,您就不会忍受它。那么,您为什么要忍受糟糕的数据呢?将其寄回并要求退款。

话虽如此,如果问题是“无效的 Unicode 字符”,那么它可能一开始是良好的 XML,但在传输过程中被损坏。找出问题所在并尽可能接近问题根源进行修复。

关于java SAXParser 忽略异常并继续解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60514789/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com