Как проанализировать XML-строку с неверными символами в SQL Server

#sql #sql-server

Вопрос:

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

Это пример XML: <root><result value="3 < 5" /></root> И мне нужно заменить специальные символы в данных, чтобы они выглядели так:

 <root><result value="3 amp;< 5" /></root>
 

Все, что я пробовал, делает полученный XML-файл похожим на это:

 amp;<rootamp;>amp;<result value="3 amp;< 5" /amp;>amp;</rootamp;>
 

Я пробовал это в среде SQL Server Management Studio:

 --THIS WORKS (with no special characters)
declare @xml xml = '<root><result prop="works like a charm" /></root>'

select
R.N.value('@prop[1]', 'nvarchar(max)') [prop]
from @xml.nodes('/root/result') as R(N)
GO

--THIS DOESN'T WORK
ERROR : XML parsing: line 1, character 24, well formed check: no '<' in attribute value
declare @xml xml = '<root><result value="3 < 5" /></root>'
GO

--THIS ALSO DOESN'T WORK - no errors, just no results
-- make XML a string initially
declare @xml_string varchar(max) = '<root><result value="3 < 5" /></root>'

--attempt to replace special characters in XML data
declare @xml xml
set @xml = ( select @xml_string for xml path(''))

--no results
select                               
R.N.value('@prop[1]', 'nvarchar(max)') [prop]               
from @xml.nodes('/root/result') as R(N)  

--because the string looks like this: amp;<rootamp;>amp;<result value="3 amp;< 5" /amp;>amp;</rootamp;>
select @xml
 

Комментарии:

1. Это не «XML-строка с плохими символами», это просто не XML. Не существует общей процедуры для преобразования недопустимого XML в допустимый XML. В особых случаях вы можете предварительно обработать строку.

2. Вам лучше всего попытаться обработать это на каком-нибудь императивном языке, таком как Python или C#, возможно, с помощью регулярных выражений. Вы могли бы, например, найти подходящие " символы и попытаться избежать всего, что в них есть. SQL Server будет очень плохо справляться с подобными вещами

3. Честно говоря, регулярное выражение тоже не очень подходит для этого.

4. ..разумные усилия.. может быть, это работает для ваших данных dbfiddle.uk/…