【问题标题】:java SAXParser ignore exception and continue parsingjava SAXParser 忽略异常并继续解析
【发布时间】:2020-03-03 20:11:42
【问题描述】:

我有一个解析 xml 文件并将其内容写入 MySQL 的 java 类。一切正常,但问题是当 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>

【问题讨论】:

  • 您能否提供错误消息以及您的数据样本?
  • 错误信息说:org.xml.sax.SAXParseException;行号:1365;列号:413;在文档的元素内容中发现无效的 XML 字符 (Unicode: 0x1)。
  • 如果在解析文件之前运行它并删除所有无效字符会怎样?像这样stackoverflow.com/questions/45009271/…
  • 这正是我所做的,非常感谢!!

标签: java xml saxparser


【解决方案1】:

我解决了它在处理之前删除了 xml 文件的无效字符。

我无法做我想做的事情(导管错误并继续),但这个解决方法有效。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我实际上是在尝试忽略这些记录,这样它们就不会被处理。我说的是 10MB 文件中的 2 个字符,但是这 2 个字符导致我在数据库中只有 100 个产品,而不是 8000 个。遗憾的是,我无法控制它们发送的这些 xml 文件。当然,我可以每天手动编辑 xml 文件以修复这些字符,但这不是我的客户需要的解决方案。
    • 它们不是 XML 文件。他们是垃圾。
    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多