Замените специальные символы xml в строке Java - PullRequest
0 голосов
/ 05 июля 2018

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

Пример ввода:

"<Message text="<html>Welcome User, <br> Happy to have you. <br>.</html>"

Ожидаемый результат:

"<Message text="&lt;html&gt;Welcome User, &lt;br&gt; Happy to have you. &lt;br&gt;.&lt;/html&gt;">

Пример ввода: <Message text="<html>Welcome User, <br> Happy to have you. </html>" Multi="false"> <Meta source="system" dest="any"></Meta></Message>

Выход: <Message text="&lt;html&gt;Welcome User, &lt;br&gt; Happy to have you. &lt;/html&gt;" Multi="false"> <Meta source="system" dest="any"></Meta></Message>

Но <br> не будет заменен, если на входе есть несколько тегов <br>.

Мы используем следующий код:

String xml = "<Message text=\"<html>Welcome User, <br> Happy to have you. <br>.</html>\" Multi=\"false\"><Meta source=\"system\" dest=\"any\"></Meta></Message>";
System.out.println("ORG:" + xml);
xml = replaceChars(xml);
System.out.println("NEW:" + xml);

private static String replaceChars(String xml)
        {
           xml = xml.replace("&", "&amp;");
           xml = xml.replaceAll("\"<([^<]*)>", "\"&lt;$1&gt;");
            xml = xml.replaceAll("</([^<]*)>\"", "&lt;/$1&gt;\"");
            xml = xml.replaceAll("\"([^<]*)<([^<]*)>([^<]*)\"", "\"$1&lt;$2&gt;$3\"");

            return xml;
        }

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Пожалуйста, не используйте регулярные выражения для экранирования специальных символов в XML.

Можете ли вы гарантировать, что это будет работать для всех возможных вводов html со всеми причудами HTML и XML (очень обширные спецификации !!!)?

Просто используйте одну из многих утилит для экранирования строк XML.

Apache Commons довольно популярен - , пожалуйста, посмотрите этот пример

0 голосов
/ 05 июля 2018

XML не является текстом. На самом деле XML-документы имеют двоичный формат .

Обработка XML как текста является неправильным подходом и работает только в простых случаях. Что нужно учитывать:

  • В документе XML отсутствует кодировка файла , но кодировка содержимого указана в документе (таким образом, он должен быть прочитан синтаксическим анализатором XML, который правильно обрабатывает это).
  • XML-документы используют XML-сущности (встроенные модули, такие как &amp;, &lt;, &gt; и &quot;, другие могут быть произвольно определены в DDL, см. https://www.w3resource.com/xml/entities.php).
  • XML-документ может содержать CDATA

Таким образом:

  • использовать правильный XML-парсер для чтения документов
  • выполнение манипуляций (замена текста, добавление / удаление узлов) на DOM (объектная модель документа) или потоковая модель.
  • используйте соответствующий XML-процессор для написания документов

Кстати, XML в вашем примере НЕ xml (искажен, поскольку никакие сущности не используются для <, >, ")

0 голосов
/ 05 июля 2018

Для соответствия вы можете использовать регулярное выражение:

(?:<)(?<=<)(\/?\w*)(?=.*(?<=<\/html))(?:>)

  • (?:<) Совпадение, но не захват <.
  • (?<=<) Позитивный взгляд за <.
  • (\/?\w*) Имя тега захвата. Необязательно / и символы слова.
  • (?=.*(?<=<\/html)) Позитивный взгляд вперед, затем позитивный взгляд за закрывающий тег.
  • (?:>) Совпадение, но не захватывание >.

Для замены вы можете использовать:

  • &lt;$1&gt;

Где $1 - результат группы захвата в регулярном выражении. Вы можете проверить регулярное выражение в интерактивном режиме здесь .

Используя следующий код Java:

 public static void main(String []args){
    String xml = "<Message text=\"<html>Welcome User, <br> Happy to have you. <br>.</html>\" Multi=\"false\"><Meta source=\"system\" dest=\"any\"></Meta></Message>";
    String newxml = replaceChars(xml);
    System.out.println(newxml);
 }

 private static String replaceChars(String xml)
    {
       xml = xml.replaceAll("(?:<)(?<=<)(\/?\w*)(?=.*(?<=<\/html))(?:>)", "&lt;$1&gt;");
       return xml;
    }

Вывод:

"<Message text="&lt;html&gt;Welcome User, &lt;br&gt; Happy to have you. &lt;/html&gt;" Multi="false"> <Meta source="system" dest="any"></Meta></Message>"

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