Как эффективно заменить специальные символы в XML в Oracle SQL? - PullRequest
0 голосов
/ 10 февраля 2020

Я анализирую xml в oracle sql.

XMLType(replace(column1,'&','<![CDATA[&]]>')) //column1 is a column name that has xml data

Во время синтаксического анализа я временно оборачиваю '&' в CDATA, чтобы исключить любое исключение xml. После избавления от исключения, вызванного '&', я получаю "недопустимый символ 32 (''), найденный в имени или Nmtoken". Это из-за символа «<». </p>

E.g: <child> 40 < 50 </child> // This causes the above exception.

Итак, я попробовал нижеприведенное, и оно работает. символ, сопровождаемый пробелом) в CDATA. Но вышесказанное занимает немного времени. Поэтому я пытаюсь использовать регулярные выражения, чтобы сократить время. Кто-нибудь знает, как реализовать вышеупомянутое действие, используя регулярное выражение в Oracle sql ??

 Input : <child> 40 & < 50 </child>
 Expected Output : <child> 40 <![CDATA[&]]> <![CDATA[< ]]> 50 </child>

Примечание: замена '&' точкой с запятой и амперсандом иногда приводит к исключению 'ссылка на сущность не правильно сформирована' , Поэтому я решил обернуть в CDATA.

1 Ответ

0 голосов
/ 10 февраля 2020

Вы можете сделать это с помощью регулярного выражения, например:

select regexp_replace(sr.column1,'(&|< )','<![CDATA[\1]]>') from dual;

Однако regexp_replace (и все функции regexp_*) часто медленнее, чем использование простого replace, потому что они делают больше сложная логика c. Поэтому я не уверен, будет ли это быстрее или нет.

Возможно, вы уже в курсе, но ваша основная проблема заключается в том, что вы начинаете с недействительным XML что вы пытаетесь исправить, что является сложной проблемой! Идеальное решение состоит в том, чтобы не указывать неверный XML во-первых - если возможно, вы должны экранировать специальные символы при первоначальной генерации XML. Существуют встроенные функции, которые могут сделать это быстро, например DBMS_XMLGEN.CONVERT или HTF.ESCAPE_S C.

...