XML-вывод SQL Server с CDATA
есть ли способ использовать CDATA для возврата XML SQL Server? У меня есть XML, возвращаемый SQL Server следующим образом:
<locations>
<site id="124">
<sitename>Texas A & M</sitename>
</site>
</locations>
когда я должен иметь это:
<locations>
<site id="124">
<sitename><![CDATA[Texas A & M]]></sitename>
</site>
</locations>
3 ответов
посмотрите на опции ДЛЯ XML ЯВНОГО (параметр директива). Это дает большую степень контроля, и вы также можете указать CDATA. Вот хороший учебник.
и код addapted из этого учебника:
declare @agent table
(
AgentID int,
Fname varchar(5),
SSN varchar(11)
)
insert into @agent
select 1, 'Vimal', '123-23-4521' union all
select 2, 'Jacob', '321-52-4562' union all
select 3, 'Tom', '252-52-4563'
SELECT
1 AS Tag,
NULL AS Parent,
NULL AS 'Agents!1!',
NULL AS 'Agent!2!AgentID',
NULL AS 'Agent!2!Fname!Element',
NULL AS 'Agent!2!SSN!cdata'
UNION ALL
SELECT
2 AS Tag,
1 AS Parent,
NULL,
AgentID,
Fname,
SSN
FROM @agent
FOR XML EXPLICIT
Как упоминал Джоэл в комментарии выше, эти две формы должны означать одно и то же. Однако, если форма CDATA действительно необходима, вы можете написать постпроцессор, который принимает первую форму в качестве входа и выводит вторую форму с помощью CDATA.
при этом постпроцессор будет unencode XML-экранированные данные в первой форме и перекодировать его с помощью CDATA-совместимого метода. На вопрос есть ли способ избежать конца CDATA токен в xml? для рассмотрения вопроса о побеге CDATA.
вот пример моего способа получения CDATA:
DECLARE @GlobalDateFormat varchar(32)
SET @GlobalDateFormat = 'MM/dd/yyyy hh:mm tt'
DECLARE @xml XML
SET @xml =
(
SELECT
SegmentId = ISNULL(SegmentId,0)
, DocumentId = ISNULL(DocumentId,0)
, Title = CAST(Core.dbo.fCharFormat('xmlCDATA',Title,DEFAULT,'') AS xml)
, DocumentShortName = CAST(Core.dbo.fCharFormat('xmlCDATA',DocumentShortName,DEFAULT,'') AS xml)
, [FileName] = CAST(Core.dbo.fCharFormat('xmlCDATA',[FileName],DEFAULT,'') AS xml)
, [Path] = CAST(Core.dbo.fCharFormat('xmlCDATA',[Path],DEFAULT,'') AS xml)
, CreateDate = ISNULL(Core.dbo.fDateFormat(@GlobalDateFormat,CreateDate),Core.dbo.fDateFormat(@GlobalDateFormat,GETDATE()))
, ModificationDate = ISNULL(Core.dbo.fDateFormat(@GlobalDateFormat,ModificationDate),Core.dbo.fDateFormat(@GlobalDateFormat,GETDATE()))
, TemplateId = ISNULL(CAST(TemplateId AS varchar(16)),'')
, IsRoot = ISNULL(IsRoot,0)
, IsActive = ISNULL(IsActive,0)
, SortOrdinal = ISNULL(CAST(SortOrdinal AS varchar(16)),'')
, ClientId = ISNULL(ClientId,'')
, Tag = CAST(Core.dbo.fCharFormat('xmlCDATA',Tag,DEFAULT,'') AS xml)
FROM
Document
WHERE
DocumentId = 9073
FOR XML AUTO, ELEMENTS
)
SELECT @xml
вот соответствующая деталь из моей ласки, как, CDATA-функция обработки:
IF @cmdName = 'xmlCDATA'
BEGIN
IF @chars IS NULL
BEGIN
SET @charsOut = @charsDefault
END
ELSE
BEGIN
SET @chars = REPLACE(@chars,'<![CDATA[','')
SET @chars = REPLACE(@chars,']]>','')
SET @charsOut = '<![CDATA[' + @chars + ']]>'
END
END