【问题标题】:How to get XML subnodes as strings along with parent attributes?如何将 XML 子节点作为字符串与父属性一起获取?
【发布时间】:2019-02-20 16:12:41
【问题描述】:

我需要解析由具有属性和子节点的节点组成的 xml。结果应该是父节点的属性和子节点的xml

declare @xml xml
set @xml = '<root>
<group Description="firstgroup">
    <nodeA age="10" birthplace="Anchorage"/>
    <nodeB mode="A" ability="read"/>
</group>
<group Description="nextgroup">
    <nodeA age="10" birthplace="London"/>
    <nodeB count="2" birthplace="Paris"/>
</group>
</root>'
select
        c.value('@Description', 'varchar(max)') as 'Description'
from @xml.nodes('/root/*') as T(c)

输出是

Description
===========
firstgroup   
nextgroup

但我需要

Description   nodeBXML
===========   ========
firstgroup    <nodeB mode="A" ability="read"/>
nextgroup     <nodeB count="2" birthplace="Paris"/>

【问题讨论】:

    标签: sql sql-server xml sql-server-2016


    【解决方案1】:
    select
            c.value('@Description', 'varchar(max)') as 'Description'
            , c.query('./nodeB')  as Content
    from @xml.nodes('/root/*') as T(c)
    
    -- Results to:
    Description Content
    firstgroup  <nodeB mode="A" ability="read" />
    nextgroup   <nodeB count="2" birthplace="Paris" />
    

    【讨论】:

      【解决方案2】:

      大概是这样的:

      示例

      Select c.value('@Description', 'varchar(max)') as 'Description'
            ,AsString = convert(varchar(max),c.query('./*[2]') )
            ,AsXML    = c.query('./*[2]')
       From  @xml.nodes('/root/*') as T(c)
      

      退货

      【讨论】:

      • 很难选择接受的答案,因为我同时有两个可接受的答案。最后我选择了 Alexander Volok 的那个,因为他使用更具体的 nodeB 而不是 [2] 。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      相关资源
      最近更新 更多