2013-11-15 3 views
4

Данного типа строки XML, таких какПолучить имя элемента XML и значение атрибута с помощью SQL запроса XPATH

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]). У меня есть большой файл со многими другими именами элементов, поэтому я не хочу разбирать их отдельно.

ответ

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 
+0

Очень полезно, спасибо! – rguy

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

+0

Очень полезно, а также ответ. – rguy