【问题标题】:SQL Convert Table row to Full XML with Special CharactersSQL 将表行转换为带有特殊字符的完整 XML
【发布时间】:2018-03-21 13:44:18
【问题描述】:

我需要从表格行创建 XML 并将其放入字段中。我目前正在使用这个:

DECLARE @x TABLE (Name VARCHAR(20), Address VARCHAR(20), Phone VARCHAR(20))
INSERT INTO @x VALUES ('Ben & Eileen Dover','5 Curdsan Way','123-456-7890')

select [MyField] = (
   select *
   from @x
   for xml path('Customer'), TYPE
)

但是,这会将& 符号转换为&。有没有什么方法可以翻译特殊字符而不必为每个字符都做一个 REPLACE?我尝试使用 (XML).value('.','varchar(max)') 技巧,但这会删除元素名称。该字段需要包含完整的 XML(正在传递给服务)。

【问题讨论】:

  • 请在标签中指定您使用的数据库
  • 根据给定的代码更改了标签。请检查此项并在必要时更正...

标签: sql-server xml tsql escaping character


【解决方案1】:

为了创建格式良好的 XML,对某些字符进行转义是绝对必要的。特别是<, > and & 是候选人。

DECLARE @x TABLE (Name VARCHAR(20), Address VARCHAR(20), Phone VARCHAR(20))
INSERT INTO @x VALUES ('Ben & Eileen Dover','5 Curdsan Way','123-456-7890')

DECLARE @xml XML=
(
   select *
   from @x
   for xml path('Customer'), TYPE
);

这是生成的 XML

<Customer>
  <Name>Ben &amp; Eileen Dover</Name>
  <Address>5 Curdsan Way</Address>
  <Phone>123-456-7890</Phone>
</Customer>

如果您将&amp;amp; 替换为&lt;Name&gt;Ben &amp; Eileen Dover&lt;/Name&gt; 之类的内容,您的XML 将不再可读。

但是所有这些字符都被隐式转义了。试试看:

SELECT @xml.value('(/Customer/Name/text())[1]','varchar(20)') AS Name
      ,@xml.value('(/Customer/Address/text())[1]','varchar(20)') AS Address
      ,@xml.value('(/Customer/Phone/text())[1]','varchar(20)') AS Phone

Name                Address         Phone
Ben & Eileen Dover  5 Curdsan Way   123-456-7890

【讨论】:

  • 并且:XML 中的&amp;amp; 将呈现为&amp;。此外,XML API 将再次以 &amp; 检索文本值。
猜你喜欢
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 2011-06-05
  • 2012-04-12
相关资源
最近更新 更多