掩埋在节点

时间:2017-02-14 15:38:52

标签: sql-server xml tsql

全新 到XML,但不是SQL。我的应用程序供应商构建的数据如下所示,我正在尝试加载到表中:

<windowsets>
  <windows>
    <question>
      <id Value="81b25d-9385-sk3" />
      <displayname Value="Thermal Break" />
      <answername Value="Yes" />    
    </question>
    <question>
      <id Value="73v32k-2743-fd9" />
      <displayname Value="Panel Profile" />
      <answername Value="Medium Stille" />    
    </question>
  </windows>
</windowsets>

通过这里的其他帖子我发现并创造了:

select
    t.x.value('(id [@Value]/text())[1]','varchar(100)') QuestionID,
    t.x.value('(displayname [@Value]/text())[1]','varchar(255)') DisplayName,
    t.x.value('(answername [@Value]/text())[1]','varchar(255)') AnswerName
from @xmlData.nodes('//windowsets/windows/question') as T(X)

但是它为所有列返回空值,我猜这是因为它期望格式为:

<displayname>Panel Profile</displayname>

因此,作为XML新手和我所做的所有搜索并没有帮助我理解如何在将值隐藏在节点中时更改代码来拉取它(甚至不确定正确的术语我是如此新颖)

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

它被称为type EmailAddress = private | Valid of string | Invalid of string

attributes阅读attributes尝试类似这样的内容

xml

答案 1 :(得分:1)

这不是一个新的答案,只是一些解释,而且很多评论:

方括号内的部分称为谓词,是一种过滤器。你的表达

displayname [@Value]/text())[1] 

会阅读text()的{​​{1}},并会检查属性<displayname>是否存在。无论如何,没有元素的文本,因此它将返回@Value

如果您想要读取属性的值,则必须导航,如NULL这样的路径。

This answer显示了XML如何处理空成员的一些示例。