有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

xml java SAXParser忽略异常并继续解析

我有一个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);
    }

但是,在我的例子中,这是没有用的,即使异常告诉我无效字符在哪里,执行也会停止,因此产品列表还远远不够完整。此列表包含大约8000个产品,只有几个无效字符,但是,如果无效字符位于前100个产品中,则数据库中不会更新所有7900个产品。我还注意到,如果发生异常,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>

共 (2) 个答案

  1. # 1 楼答案

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

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

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

  2. # 2 楼答案

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

    我不能做我想做的事情(cath error and continue),但这个变通方法奏效了