org.xml.sax. SAXParseException: ссылка на объект “T” должна закончиться''; разделитель

Я пытаюсь проанализировать XML-файл, который содержит некоторые специальные символы как "и" использующий синтаксический анализатор DOM. Я добираюсь, saxparse исключение "ссылка на объект должно закончиться разделитель". Есть ли любой способ преодолеть это исключение, так как я не могу изменить XML-файл для удаления специальных символов, так как это прибывает из другого приложения. Предложите способ проанализировать этот XML-файл для получения корневого элемента?

Заранее спасибо

Это часть XML, который я анализирую

<P>EDTA/THAM WASH 
</P>

<P>jhc ^ 72. METER SOLVENT: Meter 21 LITERS of R. O. WATER through the add line into 
FT-250. Start agitator. 
</P>

<P>R. O. WATER &lt;ZLl LITERS </P>

<P>•     NOTE: The following is a tool control operation. The area within 10 feet of any open vessel or container is under tool control. </P>

<P>-af . 73. CHARGE SOLIDS: Remove any unnecessary items from the tool controlled area. Indicate the numbers of each item that will remain in the tool controlled area during the operation in the IN box of the Tool Control Log. </P>

<P>^___y_ a. To minimize the potential for cross contamination, confirm that no other solids are being charged or packaged in adjacent equipment. </P>

<P>kk k WARNING: Wear protective gloves, air jacket and use local exhaust when handling TROMETHAMINE USP (189400) (THAM) (K-l--Irritant!). The THAM may be dusty. </P>

<P>-&lt;&amp;^b .   Charge 2.1 KG of TROMETHAMINE USP (189400) (THAM) into FT-250 through the top. </P>

<P>TROMETHAMINE USP (189400) (THAM) </P>

<P>Scale ID:     / / 7S </P>

<P>LotNo.:   qy/o^yo^ </P>

<P>Gross:    ^ . S </P>

<P>Tare: 10 ,1 </P>

<P>Net:     J^l </P>

<P>Total:   JL'J </P>

<P><Figure ActualText="&T ">

<ImageData src="images/17PT 07009K_img_1.jpg"/>
&amp;T </Figure>
Checked by </P>
17
задан Joachim Sauer 22 December 2009 в 07:45
поделиться

4 ответа

Как заявляли другие, ваш XML определенно недействителен. Однако, если вы не можете изменить генерирующее приложение и можете добавить шаг очистки, то следующий шаг должен очистить XML:

String clean = xml.replaceAll( "&([^;]+(?!(?:\\w|;)))", "&amp;$1" );

Что делает этот регекс, так это ищет любые плохо сформированные ссылки на сущности и экранирует амперсанд.

В частности, (?!(?:\\w|;)) - это негативный взгляд, который заставляет это совпадение остановиться на всем, что не является словесным символом (a-z,0-9), а не полустолбцом. Таким образом, весь регекс захватывает все, начиная с &, который не является a ; и заканчивая первым несловным, не-полустолковым символом.

Он помещает все, кроме амперсанда, в первую группу захвата, чтобы на него можно было ссылаться в строке замены. Это $1.

Обратите внимание, что это не исправит ссылки, которые выглядят так, как будто они действительны, но не являются таковыми. Например, если у вас есть &T; это приведет к ошибке другого рода, если только XML на самом деле не определяет сущность.

.
29
ответ дан 30 November 2019 в 10:29
поделиться

Я не уверен, что понял вопрос. Насколько я знаю, если вы не находитесь внутри CDATA, голые и символы без замыкания ; являются недействительными.

Если это не так для вашего XML файла, то он недействителен, и вам нужно будет найти другой способ его разбора или исправления, прежде чем SAX получит его в руки.

Если я что-то здесь не так понял, вам, вероятно, следует поместить образец фактического XML, чтобы мы могли продолжить.

Обновление:

Похоже, что:

Figure ActualText="&T "

- это оскорбительная строка. Этот раздел находится в пределах CDATA или нет? Если нет, то это не действительный XML и вы не должны ожидать, что SAX сможет его обрабатывать.

Вам нужно либо:

  • изменить приложение, которое его создало; либо
  • исправить его перед загрузкой SAX (если вы не можете изменить это приложение) на что-то вроде "Figure ActualText="&T ""; либо
  • найти не-SAX-метод для разбора.
12
ответ дан 30 November 2019 в 10:29
поделиться

В качестве обходного пути можно:

  1. Заменить все вхождения и на & на оригинальном входе;
  2. Parse it;
  3. В Вашем коде, который обрабатывает результат, обработайте регистр, в котором Вы теперь получаете экранированные символы (например, < вместо <).

В зависимости от используемого парсера, Вы также можете попробовать найти класс, отвечающий за парсинг и дешифрирование строк &- и посмотреть, можете ли Вы расширить его/поставить свой собственный резольвер. (То, что я говорю, очень расплывчато, но специфика зависит от используемых инструментов.)

.
1
ответ дан 30 November 2019 в 10:29
поделиться

Ваш ввод недействителен XML. В частности, вы не можете иметь символ '&' в значении атрибута, если только он не является частью хорошо сформированной ссылки на сущность символа.

AFAIK, у вас есть два варианта:

  • Запишите парсер "не совсем XML" самостоятельно. Я серьезно сомневаюсь, что вы найдете существующий. Любой уважающий себя парсер XML отвергнет неправильный ввод.
  • Исправьте, что бы ни создавало этот (так называемый) XML, чтобы он не помещал случайные символы '&' в те места, где они запрещены. На самом деле это довольно просто. Так как вы создаете XML, замените символ '&', который еще не является частью символьной ссылки, на '&'
1
ответ дан 30 November 2019 в 10:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: