org.xml.sax.SAXParseException: ссылка на сущность "T" должна заканчиваться символом ";" ограничитель - PullRequest
16 голосов
/ 22 декабря 2009

Я пытаюсь проанализировать файл 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>

Ответы [ 8 ]

27 голосов
/ 22 декабря 2009

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

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

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

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

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

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

12 голосов
/ 22 декабря 2009

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

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

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

Обновление:

Похоже:

Figure ActualText="&T "

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

Вам понадобится либо:

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

Некоторые из вас могут быть знакомы с ОШИБКОЙ «Ссылка на сущность XX должна заканчиваться символом«; »при добавлении или изменении любого фрагмента кода в ваши шаблоны XML. Даже я иногда получаю эту ОШИБКУ, когда пытаюсь изменить или добавить некоторые коды в шаблоны блога моего блога (XML).

В основном такого рода ОШИБКИ возникают, когда мы добавляем сторонние баннеры или виджеты в наши XML-шаблоны. Мы можем легко исправить эту ОШИБКУ, внеся небольшое изменение в фрагмент кода, который мы добавляем!

Just replace “&” with “&amp;” in your HTML/Javascript code!

Пример

Original Code:
<!– Begin Code –>
<script src="http://XXXXXX.com/XXX.php?sid=XXX&br=XXX&dk=XXXXXXXXXXXX" type="text/javascript"/>
<!– End Code –>

Altered Code:

<!– Begin Code –>
<script src="http://XXXXXX.com/XXX.php?sid=XXX&amp;br=XXX&amp;dk=XXXXXXXXXXXX" type="text/javascript"/>
<!– End Code –>
2 голосов
/ 02 октября 2013

Опираясь на приведенный выше ответ PSpeed, замените все регулярные выражения и текст замены заменит все неэкранированные амперсанды на экранированные амперсанды.

String clean = xml.replaceAll( ("(&(?!amp;))", "&amp;") );

Шаблон является негативным взглядом на любые амперсанды, которые еще не экранированы, а замещающая строка - просто экранированный амперсанд. Это может быть дополнительно оптимизировано для повышения производительности с использованием статически скомпилированного шаблона.

private final static Pattern unescapedAmpersands = Pattern.compile("(&(?!amp;))");

...

Matcher m = unescapedAmpersands.matcher(xml);
String xmlWithAmpersandsEscaped = m.replaceAll("&amp;");
1 голос
/ 22 декабря 2009

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

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

  • Напишите синтаксический анализатор "не совсем XML" самостоятельно. Я серьезно сомневаюсь, что вы найдете существующий. Любой уважающий себя парсер XML отклонит неверный ввод.
  • Исправьте все, что создает этот (так называемый) XML, чтобы он не помещал случайные символы '&' в места, где они не разрешены. Это довольно просто на самом деле. При создании XML замените символ '&', который еще не является частью ссылки на символ, на '& amp;'
1 голос
/ 22 декабря 2009

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

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

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

0 голосов
/ 11 апреля 2019

Это будет работать, если вы используете приведенную ниже команду перед публикацией.

пожалуйста, введите имя вашего XML-файла в команду ниже

sed -i "s/&/;/g" *.xml
0 голосов
/ 06 июля 2016

Просто замените & на &amp;, и оно будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...