Как разобрать XML с помощью специального символа в SQL Server - PullRequest
12 голосов
/ 29 марта 2012

Я получаю следующую ошибку, когда добавляю < в мой xml,

Сообщение 9455, Уровень 16, Состояние 1, Строка 6, Анализ XML строки: строка 4, символ 14, недопустимое квалифицированное имясимвол

Как я могу разобрать xml с этим типом специальных символов?

DECLARE @MyXML XML
SET @MyXML = '<SampleXML>
<Colors>
<Color1>W < hite</Color1>
<Color2>Blue</Color2>
<Color3>Black</Color3>
<Color4 Special="Light">Green</Color4>
<Color5>Red</Color5>
</Colors>
<Fruits>
<Fruits1>Apple</Fruits1>
<Fruits2>Pineapple</Fruits2>
<Fruits3>Grapes</Fruits3>
<Fruits4>Melon</Fruits4>
</Fruits>
</SampleXML>'

SELECT
a.b.value('Colors[1]/Color1[1]','varchar(10)') AS Color1,
a.b.value('Colors[1]/Color2[1]','varchar(10)') AS Color2,
a.b.value('Colors[1]/Color3[1]','varchar(10)') AS Color3,
a.b.value('Colors[1]/Color4[1]/@Special','varchar(10)')+' '+
+a.b.value('Colors[1]/Color4[1]','varchar(10)') AS Color4,
a.b.value('Colors[1]/Color5[1]','varchar(10)') AS Color5,
a.b.value('Fruits[1]/Fruits1[1]','varchar(10)') AS Fruits1,
a.b.value('Fruits[1]/Fruits2[1]','varchar(10)') AS Fruits2,
a.b.value('Fruits[1]/Fruits3[1]','varchar(10)') AS Fruits3,
a.b.value('Fruits[1]/Fruits4[1]','varchar(10)') AS Fruits4
FROM @MyXML.nodes('SampleXML') a(b)

Ответы [ 3 ]

19 голосов
/ 29 марта 2012

Недопустимые специальные символы и их замена в xml

  1. & - &amp;
  2. <- <code>&lt;
  3. > - &gt;
  4. "- &quot;
  5. '- &#39;
10 голосов
/ 29 марта 2012

< необходимо указать как &lt; в XML

<SampleXML>
<Colors>
<Color1>W &lt; hite</Color1>
<Color2>Blue</Color2>
<Color3>Black</Color3>
<Color4 Special="Light">Green</Color4>
<Color5>Red</Color5>
</Colors>
<Fruits>
<Fruits1>Apple</Fruits1>
<Fruits2>Pineapple</Fruits2>
<Fruits3>Grapes</Fruits3>
<Fruits4>Melon</Fruits4>
</Fruits>
</SampleXML>

Обновление:

Символы, которые вам нужны для перехода в значениях узлов: < => &lt; и & => &amp;.
В значениях атрибутов вам также нужно экранировать " => &quot;, если вы используете " вокруг значений вашего атрибута.

Это действительный XML:

<root>
  <item> &lt; > &amp; ' "</item>
  <item att=" &lt; > &amp; ' &quot;" />
</root>

Попробуйте в запросе:

declare @xml xml =
'
<root>
  <item> &lt; > &amp; '' "</item>
  <item att=" &lt; > &amp; '' &quot;" />
</root>
'

select @xml.value('(root/item)[1]', 'varchar(20)') as NodeValue,
       @xml.value('(root/item/@att)[1]', 'varchar(20)') as AttValue

Результат:

NodeValue            AttValue
-------------------- --------------------
 < > & ' "            < > & ' "
4 голосов
/ 29 марта 2012

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

, например

DECLARE @MyXML XML
SET @MyXML = '<SampleXML>
<Colors>
<Color1>W &lt; hite</Color1>
<Color2>Blue</Color2>
<Color3>Black</Color3>
<Color4 Special="Light">Green</Color4>
<Color5>Red</Color5>
</Colors>
<Fruits>
<Fruits1>Apple</Fruits1>
<Fruits2>Pineapple</Fruits2>
<Fruits3>Grapes</Fruits3>
<Fruits4>Melon</Fruits4>
</Fruits>
</SampleXML>'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...