使用动态节点名称的XSINIL for XML

时间:2012-07-12 21:40:53

标签: sql-server xml

有点坚持这个。我有一个名称/值列表:

NameValue table
-----------------------------------------------------------
Name varchar(100)    Value varchar(100)
-----------------------------------------------------------
FirstName            First value
SecondName           Second value
ThirdName            Null or Empty String
etc...            

我试图让我的结果看起来像下面的XML,但我不能完全实现。

<MyValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <FirstName>First value</FirstName>
  <SecondName>Second value</SecondName>
  <ThirdName xsi:nil="true" />
</MyValues>

为了使动态名称有效,我将XML连接起来并像以下一样转换为XML:

select cast('<' + name +  '>' + value + '</' + name + '>' as xml)
from NameValue
for xml raw(''), root('MyValues'), elements xsinil

上述查询生成的此XML不带xsi:nil="true"

<MyValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <FirstName>First value</FirstName>
  <SecondName>Second value</SecondName>
  <ThirdName />
</MyValues>

如果我不使用XML,我会留下以下内容:

<MyValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
&lt;FirstName&gt;First value&lt;/FirstName&gt;&lt;
etc...

我尝试在连接中添加xsi:nil="true",但是收到有关缺少的命名空间的错误。我猜这个工作,我将不得不为包含null或空字符串的每一行添加相同的命名空间,因此结果如下所示:

<MyValues>
  <FirstName>First value</FirstName>
  <SecondName>Second value</SecondName>
  <ThirdName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
</MyValues>

结果集中可能有几百个空字符串,所以我更喜欢将命名空间放在根级别以节省带宽。这有可能吗?

1 个答案:

答案 0 :(得分:0)

我没有使用FOR XML,而只是将整个XML作为连接字符串。

declare @xml varchar(max)
set @xml = '<MyValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'

select @xml = '<' + name +  
    case when len(value) = 0 then 'xsi:nil="true" />'
         else '>' + value + '</' + name + '>'
    end 
from NameValue 

select @xml + "</MyValues>"