java SAXParser игнорирует исключение и продолжает анализ - PullRequest
0 голосов
/ 03 марта 2020

У меня есть класс 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>

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Я решил это, удалив недопустимые символы из файла xml перед обработкой.

Я не смог сделать то, что пытался сделать (ошибка cath и продолжить), но этот обходной путь работал.

0 голосов
/ 04 марта 2020

Философия XML заключается в том, что вы не обрабатываете плохие данные. Если он не правильно сформирован XML, парсер должен сдаться, а пользовательские приложения должны сдаться. С культурной точки зрения это реакция на культуру HTML, где было установлено, что, если в целом ожидается, что пользователи данных будут терпеть неверные данные, в результате поставщики будут выдавать неверные данные.

Стандарты обеспечивают снижение затрат потому что вы можете использовать легкодоступные готовые инструменты как для создания действительных данных, так и для чтения их на другом конце. Преимущества полностью нейтрализуются, если вы решите, что собираетесь поменяться местами, которые почти XML, но не совсем. Если бы вы загружали программное обеспечение, вы бы не смирились с ним, если бы оно не компилировалось. Так почему вы готовы мириться с плохими данными? Отправьте его обратно и потребуйте возмещение.

Сказав, что, если проблема заключается в «недопустимых символах Юникода», то вполне возможно, что он начался с хорошего XML и был поврежден при передаче. Узнайте, что пошло не так, и устраните ее как можно ближе к источнику проблемы.

...