【发布时间】:2018-09-27 23:12:19
【问题描述】:
我已经在这个网站和其他地方对这个主题进行了一些研究,我认为我有点接近解决方案,但我仍然遇到了一些麻烦。我将 XML 保存在一条记录中,格式化后看起来像这样(这是一个 sn-p):
<samlp:Response>
<saml:Assertion>
<saml:AttributeStatement>
<saml:Attribute Name="Market Indicator">
<saml:AttributeValue>SG</saml:AttributeValue>
</saml:Attribute>
<saml:Attribute Name="Proposed Coverage Effective Date">
<saml:AttributeValue>12/1/2017</saml:AttributeValue>
</saml:Attribute>
<saml:Attribute Name="Premium Amount Total">
<saml:AttributeValue>5.00</saml:AttributeValue>
</saml:Attribute>
<saml:Attribute Name="Group Identifier">
<saml:AttributeValue>11111</saml:AttributeValue>
</saml:Attribute>
<saml:Attribute Name="Group Name">
<saml:AttributeValue>Construction Company</saml:AttributeValue>
</saml:Attribute>
</saml:Attribute>
<saml:Attribute Name="State">
<saml:AttributeValue>PA</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
</saml:Assertion>
</samlp:Response>
我遇到的第一个问题是能够用空格调出属性名称:
SELECT m.c.value('@Group Identifier', 'varchar(max)') AS [Group]
FROM dbo.PaymentLog PL
outer apply
pl.response.nodes('/Response/Assertion/AttributeStatement/Attribute') as
m(c)
Msg 2209, Level 16, State 1, Line 84
XQuery [dbo.PaymentLog.Response.value()]: Syntax error near 'Group'
但如果我尝试一个不带空格的属性名称,我只会得到NULL 结果。
SELECT m.c.value('@State', 'varchar(max)') AS [State]
FROM dbo.PaymentLog PL
outer apply
pl.response.nodes('/Response/Assertion/AttributeStatement/Attribute') as
m(c)
我也尝试了以下查询,但也得到了NULL 结果:
SELECT m.c.value('data(.)', 'varchar(max)') AS [Values]
FROM dbo.PaymentLog PL
outer apply
pl.response.nodes('/Response/Assertion/AttributeStatement/Attribute
[@Name="State"]') as m(c)
我认为我在球场上,但我找不到任何东西似乎可以解决我的 XML 的特定架构。
【问题讨论】:
-
在 XML 中处理命名空间可能会令人困惑。看起来您的 XML 不完整(您有两个不同的名称空间,但您没有显示名称空间实际指向的内容),但您的一个解决方案可能类似于
with xmlnamespaces ('abc.com' as samlp, 'xyz.com' as saml) select m.c.value... pl.response.nodes('/samlp:Response/saml:Assertion/saml:AttributeStatement/saml:Attribute[@Name="State"]') as m(c)其中 abc.com 和 xyz.com 是您的任何命名空间实际上是。
标签: sql-server xml parsing xml-parsing ssms