解析数据透视的 xml

问题描述 投票:0回答:1

我有以下 xml 数据

<browse result="1">
  <th>
    <td label="Company ID"></td>
    <td label="Company Name"></td>
    <td label="Country"></td>
    <td label="Region"></td>
  </th>
  <tr>
    <td>ABC01</td>
    <td>Company 1</td>
    <td>United States</td>
    <td>North America</td>
  </tr>
  <tr>
    <td>ABC02</td>
    <td>Company 2</td>
    <td>China</td>
    <td>Asia</td>
  </tr>
</browse>

我的决赛桌应该是这样的

公司ID 公司名称 国家 地区
ABC01 公司1 美国 北美
ABC02 公司2 中国 亚洲

或其旋转版本

标签 值1 值2
公司ID ABC01 ABC02
公司名称 公司1 公司2
国家 美国 中国
地区 北美 亚洲

这是我到目前为止所尝试过的

declare @xmldata nvarchar(4000) = '<browse result="1">
  <th>
    <td label="Company ID"></td>
    <td label="Company Name"></td>
    <td label="Country"></td>
    <td label="Region"></td>
  </th>
  <tr>
    <td>ABC01</td>
    <td>Company 1</td>
    <td>United States</td>
    <td>North America</td>
  </tr>
  <tr>
    <td>ABC02</td>
    <td>Company 2</td>
    <td>China</td>
    <td>Asia</td>
  </tr>
</browse>'

select
     a.value('@label', 'varchar(max)') as label
    ,b.value('.', 'nvarchar(max)') as value
from (select top (1) CAST(REPLACE(CAST(@xmldata AS NVARCHAR(MAX)),'utf-8','utf-16') AS XML) as xmldata) as s
    outer apply s.xmldata.nodes('/browse/th/td') as l(a)
    outer apply s.xmldata.nodes('/browse/tr/td') as v(b)

但它给了我 32 行,其中大部分是 4 个标签与值的错误重复组合。我应该如何实现这个目标?

sql-server xml xml-parsing xquery xquery-sql
1个回答
2
投票

如果我们可以假设这些值处于静态位置,那么您只需要查看

tr
节点,然后使用它们的序数位置从中获取每个
td
节点:

DECLARE @xml xml = '<browse result="1">
  <th>
    <td label="Company ID"></td>
    <td label="Company Name"></td>
    <td label="Country"></td>
    <td label="Region"></td>
  </th>
  <tr>
    <td>ABC01</td>
    <td>Company 1</td>
    <td>United States</td>
    <td>North America</td>
  </tr>
  <tr>
    <td>ABC02</td>
    <td>Company 2</td>
    <td>China</td>
    <td>Asia</td>
  </tr>
</browse>';


SELECT b.th.value('td[1]','varchar(20)') AS CompanyID,
       b.th.value('td[2]','varchar(20)') AS CompanyName,
       b.th.value('td[3]','varchar(20)') AS Country,
       b.th.value('td[4]','varchar(20)') AS Region
FROM @xml.nodes('browse/tr') b(th);
© www.soinside.com 2019 - 2024. All rights reserved.