使用SQL XPATH查询获取XML元素名称和属性值

时间:2013-11-15 22:05:48

标签: sql sql-server xml tsql sqlxml

给定XML类型字符串,例如

declare @xml xml

SET @xml = 
'<PO>
  <Amount type="approved">10.00</Amount>
  <Year type="">2013</Year>
  <GeneralNotes>
    <Note>
      <NoteText type="instruction">CallVendor</NoteText>
      <Date type="">1-1-2013</Date>
    </Note>
    <Note type="">
      <NoteText type="instruction">ShipNow</NoteText>
      <Date type="">2-2-2013</Date>
    </Note>
  </GeneralNotes>
</PO>'

我希望得到每个元素及其属性(如果有的话)。我想要的输出(没有重复)是

ElementName   ElementAttribute

PO  
Amount   approved
Note     instruction

我尝试过与此行类似的代码

SELECT T.doc.query('fn:local-name(.)') 
FROM @xml.nodes('PO//*[1]') AS T(doc)

这会带来重复,我不知道如何选择属性值。我只需要第一次出现(即,GeneralNotes/Note[1])。我有一个包含许多其他元素名称的大文件,因此我不想单独解析它们。

2 个答案:

答案 0 :(得分:1)

SELECT DISTINCT
       T.doc.value('fn:local-name(..)[1]', 'nvarchar(max)') as ElementName,
       T.doc.value('.', 'nvarchar(max)') as ElementAttribute 
FROM @xml.nodes('PO//@*[1]') AS T(doc)
WHERE T.doc.value('.', 'nvarchar(max)') <> ''

结果:

ElementName     ElementAttribute
--------------- ----------------
Amount          approved
NoteText        instruction

答案 1 :(得分:0)

select distinct
    a.c.value('local-name(..)', 'nvarchar(max)') as ElementName,
    a.c.value('.', 'nvarchar(max)') as ElementAttribute
from @xml.nodes('//@*[. != ""]') as a(c)

<强> sql fiddle demo