У меня есть класс java, который анализирует файл xml и записывает его содержимое в MySQL. Все работает нормально, но проблема в том, что когда файл xml содержит недопустимые символы Юникода, возникает исключение, и программа прекращает синтаксический анализ файла.
Мой провайдер ежедневно отправляет этот файл xml с список товаров с указанием цены, количества и пр. c. и я не имею никакого контроля над этим, поэтому недопустимые символы всегда будут там.
Все, что я пытаюсь сделать, это перехватить эти ошибки, игнорировать их и продолжить анализ остальной части xml file.
Я добавил операторы try-catch для методов startElement
, endElement
и characters
класса SAXHandler, однако они не перехватывают никаких исключений, и выполнение останавливается всякий раз, когда синтаксический анализатор находит недопустимый символ.
Кажется, что я могу отлавливать только те исключения из функции, которая вызывает синтаксический анализатор:
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
не вызывается, если возникает исключение.
Кто-то задавал тот же вопрос здесь несколько лет go, но не получил никакого решения.
Я бы очень признателен за любые идеи или обходные пути для этого.
Образец данных (по запросу):
<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>