Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 XML escape < >  [new]
XML parser
Guest
Коллеги, добрый день.

Как мне обработать некорректные символы в XML < >?

Ко мне в процедуру приходит xml файл в виде varchar:

DECLARE @v varchar(MAX) = 
'<Tag1>
  <Text>Текст а в нем сюрприз & <Instruction/Document/Instr/Bnfcl/OwnrId/NmAdr/Nm><Text>
</Tag1>'

SELECT @v


Соответвтенно, символ & я могу обработать таким образом:
SELECT REPLACE(@v, '&', '&')


Он не зависит от расположения, а как мне корректно обработать > и < без привязки к тексту?
3 июл 17, 11:42    [20608382]     Ответить | Цитировать Сообщить модератору
 Re: XML escape < >  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
XML parser,

Смотрите спецсимволы XML.
В данном случае & lt; и & gt; (без пробелов)
3 июл 17, 11:54    [20608434]     Ответить | Цитировать Сообщить модератору
 Re: XML escape < >  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
XML parser,

Только вот момент: корректно должно быть на входе. Постфактум из говна конфетку сделать проблематично.
3 июл 17, 11:56    [20608444]     Ответить | Цитировать Сообщить модератору
 Re: XML escape < >  [new]
XML parser
Guest
Так вот вопрос - как вычленить эти символы, т.е. корректно заменить.
Пример выше, обрамленный текст может быть каким угодно.
3 июл 17, 12:00    [20608456]     Ответить | Цитировать Сообщить модератору
 Re: XML escape < >  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
DECLARE @v varchar(MAX) = 
'<Tag1>
  <Text>Текст а в нем сюрприз & <Instruction/Document/Instr/Bnfcl/OwnrId/NmAdr/Nm></Text>
</Tag1>';

select @v = replace(replace(@v, '<Text>', '<Text><![CDATA['), '</Text>', ']]></Text>');
select @v, cast(@v as xml);
3 июл 17, 12:00    [20608458]     Ответить | Цитировать Сообщить модератору
 Re: XML escape < >  [new]
XML parser
Guest
invm,

Спасибо. Но в вашем примере получается, надо знать название тега, внутри которого есть символы недопустимые символы (>, <).
А как быть, если не знаешь внутри каких тегов они будут?
Как быть, если одинаковые теги вложенные, например вот так:

DECLARE @v varchar(MAX) = 
'<Tag1>
  <Text>Текст а в нем сюрприз
    <Text>
    <CorporateActionInstruction/Document/CorpActnInstr/BnfclOwnrDtls/OwnrId/NmAndAdr/Nm></Text>
  </Text>
</Tag1>';
3 июл 17, 12:28    [20608563]     Ответить | Цитировать Сообщить модератору
 Re: XML escape < >  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
XML parser
А как быть, если не знаешь внутри каких тегов они будут?
Как быть, если одинаковые теги вложенные, например вот так:

А ты заранее проблему не решай.
У тебя одна проблема - невалидный XML на входе, вот сосредоточься на этом - найди гада и набей ему морду.
3 июл 17, 12:33    [20608585]     Ответить | Цитировать Сообщить модератору
 Re: XML escape < >  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
XML parser
А как быть, если не знаешь внутри каких тегов они будут?
Как быть, если одинаковые теги вложенные, например вот так:
В общем случае никак не быть, ибо задача нерешаемая.
Требуйте с авторов этого чуда валидный XML.
3 июл 17, 12:42    [20608611]     Ответить | Цитировать Сообщить модератору
 Re: XML escape < >  [new]
XML parser
Guest
Руслан Дамирович,

это внешняя система, нужно обработать их as is.
3 июл 17, 12:43    [20608614]     Ответить | Цитировать Сообщить модератору
 Re: XML escape < >  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7399
XML parser,

as is отправить им ноту протеста о канонизации XML. То, что они присылают - не XML и обработан быть машинными средствами не может.
Ну или напишите или найдите готовый канонизатор.
3 июл 17, 12:56    [20608659]     Ответить | Цитировать Сообщить модератору
 Re: XML escape < >  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
XML parser
Руслан Дамирович,
это внешняя система, нужно обработать их as is.

А ну да, если ты в магазине купишь молоко, а там внутри жидкие фекалии - будешь есть as is?
3 июл 17, 13:35    [20608824]     Ответить | Цитировать Сообщить модератору
 Re: XML escape < >  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Руслан Дамирович
XML parser
Руслан Дамирович,
это внешняя система, нужно обработать их as is.

А ну да, если ты в магазине купишь молоко, а там внутри жидкие фекалии - будешь есть as is?


+

Простите не сдержался долго смеялся с этого комментария
3 июл 17, 22:54    [20610763]     Ответить | Цитировать Сообщить модератору
 Re: XML escape < >  [new]
Addx
Member

Откуда:
Сообщений: 957
XML parser
invm,

Спасибо. Но в вашем примере получается, надо знать название тега, внутри которого есть символы недопустимые символы (>, <).
А как быть, если не знаешь внутри каких тегов они будут?
Как быть, если одинаковые теги вложенные, например вот так:

DECLARE @v varchar(MAX) = 
'<Tag1>
  <Text>Текст а в нем сюрприз
    <Text>
    <CorporateActionInstruction/Document/CorpActnInstr/BnfclOwnrDtls/OwnrId/NmAndAdr/Nm></Text>
  </Text>
</Tag1>';


Всегда можно обработать текст внешними средствами - не обязательно это делать в SQL.
Это не XML, а СУБД не очень хорошо приспособлены для парсинга нестандартных данных.
3 июл 17, 23:21    [20610799]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить