首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从XML列读取属性值

从XML列读取属性值
EN

Stack Overflow用户
提问于 2021-11-14 23:25:52
回答 1查看 35关注 0票数 0

如何从XML数据中提取属性的值?

代码语言:javascript
复制
drop table #demo2
create table #demo2 (field1 xml)
insert into #demo2 (field1) 
values (
'<root xmlns="system/schema" vesion="1.0">
    <header msgtype="1">
        <msgid>1</msgid>
    </header>
    <transaction>
        <systemevent>
            <eventdetail eventtype="100">
                <eventstamp unitid="87888" value="2021-11-14T01:44:41.069Z" />
                <eventitem id="1" value="abc123" />
            </eventdetail>
            <eventdetail eventtype="102">
                <eventstamp unitid="87889" value="2021-11-14T01:44:41.704Z" />
                <eventitem id="2" />
            </eventdetail>
        </systemevent>
    </transaction>
</root>')

我期望这个XML的答案是abc123 & null。下面是我试图获得期望值的查询。

代码语言:javascript
复制
select  x.v.value('@value','VARCHAR(100)') AS EventValue,
        y.v.value('@value','VARCHAR(100)') AS EventValue2
from #demo2 t
cross apply field1.nodes('//eventdetail[@eventtype="100"]/eventitem') x(v)
cross apply field1.nodes('//eventdetail[@eventtype="102"]/eventitem') y(v)

我不确定我的xpath中缺少了什么来获取该值。谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-14 23:40:03

这一点:

<root xmlns="system/schema" vesion="1.0">

意味着文档有一个default namespace,所以所有元素实际上都在名称空间中。那个文档等同于这个文档:

代码语言:javascript
复制
<foo:root xmlns:foo="system/schema" vesion="1.0">
  <foo:header msgtype="1">
    <foo:msgid>1</foo:msgid>
  </foo:header>
  <foo:transaction>
    <foo:systemevent>
      <foo:eventdetail eventtype="100">
        <foo:eventstamp unitid="87888" value="2021-11-14T01:44:41.069Z" />
        <foo:eventitem id="1" value="abc123" />
      </foo:eventdetail>
      <foo:eventdetail eventtype="102">
        <foo:eventstamp unitid="87889" value="2021-11-14T01:44:41.704Z" />
        <foo:eventitem id="2" />
      </foo:eventdetail>
    </foo:systemevent>
  </foo:transaction>
</foo:root>

因此您必须使用WITH XMLNAMESPACES对查询进行命名空间限定,例如

代码语言:javascript
复制
WITH XMLNAMESPACES (DEFAULT 'system/schema')  
select  x.v.value('@value','VARCHAR(100)') AS EventValue,
        y.v.value('@value','VARCHAR(100)') AS EventValue2
from #demo2 t
cross apply field1.nodes('//eventdetail[@eventtype="100"]/eventitem') x(v)
cross apply field1.nodes('//eventdetail[@eventtype="102"]/eventitem') y(v)

在大多数情况下,您还应该完全限定元素XPath,而不是使用//。例如

代码语言:javascript
复制
WITH XMLNAMESPACES (DEFAULT 'system/schema')  
select  x.v.value('@value','VARCHAR(100)') AS EventValue,
        y.v.value('@value','VARCHAR(100)') AS EventValue2
from #demo2 t
cross apply field1.nodes('/root/transaction/systemevent/eventdetail[@eventtype="100"]/eventitem') x(v)
cross apply field1.nodes('/root/transaction/systemevent/eventdetail[@eventtype="102"]/eventitem') y(v)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69968009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档