将字符串转换为XML

时间:2018-03-20 14:10:37

标签: sql-server xml tsql xml-namespaces for-xml

如何将以下字符串转换为XML,

SET @string = '<Field>
<Field Name="'+@Cname+'">
<DataField>'+@Cname+'</DataField>
<rd:TypeName>System.String</rd:TypeName>
</Field>'

我尝试了SET @xmlstring = CONVERT(XML,@string),但它显示如下错误 Msg 9459,Level 16,State 1,Line 17 XML解析:第4行,第13个字符,未声明的前缀

2 个答案:

答案 0 :(得分:2)

您的xml需要正确格式化。

尝试使用'/'关闭标记字段和prop名称,并在TypeName中取出前缀rd。

SET @string = '<Field>
<Field Name="'+@Cname+'" />
<DataField>'+@Cname+'</DataField>
<TypeName>System.String</TypeName>
</Field>'

http://sqlfiddle.com/#!18/9eecb/8282/0

答案 1 :(得分:2)

哦不!永远不要通过字符串连接创建XML!试想一下,你的变量带有this -> valueTim, Tom & Fred之类的值......这可能会完美地运行,传递所有测试并在推出后出现未定义的错误。

始终使用SQL-Servers支持来创建XML:

DECLARE @cname VARCHAR(100)='Some Name';

DECLARE @xml XML=
(
    SELECT  @cname AS [Field/@Name]
           ,@cname AS [DataField]
           ,'System.String' AS [TypeName]
    FOR XML PATH('Field')
);
SELECT @xml;

结果

<Field>
  <Field Name="Some Name" />
  <DataField>Some Name</DataField>
  <TypeName>System.String</TypeName>
</Field>

这里有命名空间:

WITH XMLNAMESPACES('Some.namespace.url' AS rd)
SELECT @xml=
( 
    SELECT  @cname AS [Field/@Name]
            ,@cname AS [DataField]
            ,'System.String' AS [rd:TypeName]
    FOR XML PATH('Field')
);
SELECT @xml

结果

<Field xmlns:rd="Some.namespace.url">
  <Field Name="Some Name" />
  <DataField>Some Name</DataField>
  <rd:TypeName>System.String</rd:TypeName>
</Field>