#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/…