2016-11-05 5 views
2

У меня есть XML-файл, хранящийся в таблице SQL. Теперь я хочу прочитать значение z конкретного элемента, используя SQL.Выберите конкретный элемент из XML с пространством имен XML

Я могу прочитать конкретное значение элемента из XML, если XML не имеет в нем элемента пространства имен. Я хочу прочитать XML-файл с пространством имен.

Вот мой XML-файл:

<currency:Envelope xmlns="http://www.currency.com/eurofxref" xmlns:currency="http://www.currency.org/xml/2002-08-01"> 
<Cube> 
    <Cube time="2016-11-04"> 
    <Cube currency="USD" rate="1.1093" /> 
    <Cube currency="JPY" rate="114.24" /> 
    <Cube currency="BGN" rate="1.9558" /> 
    <Cube currency="CZK" rate="27.021" />  
    </Cube> 
</Cube> 
</currency:Envelope> 

Вот код SQL для чтения значений:

CREATE TABLE XMLwithOpenXML 
(
    Id INT IDENTITY PRIMARY KEY, 
    XMLData XML, 
    LoadedDateTime DATETIME 
) 

INSERT INTO XMLwithOpenXML(XMLData, LoadedDateTime) 
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE() 
FROM OPENROWSET(BULK 'E:\currency.xml', SINGLE_BLOB) AS x; 

SELECT XMLData.value('(Cube/Cube/Cube[@currency="USD"]/@rate)[1]','VARCHAR(MAX)') 
FROM XMLwithOpenXML 

ответ

2

Вам необходимо выбрать в соответствующем XML пространство имен. Вы можете объявить пространство имен с помощью WITH XMLNAMESPACES и связать его с префиксом. Затем используйте этот префикс при обращении к элементам в пространстве имен.

WITH 
    XMLNAMESPACES('http://www.currency.com/eurofxref' AS efr) 
SELECT 
    rate=XMLData.value('(//efr:Cube/efr:Cube/efr:Cube[@currency="USD"]/@rate)[1]','VARCHAR(MAX)') 
FROM 
    XMLwithOpenXML; 
+1

+1 с моей стороны. Просто упомянуть: * нужно выбрать *, это немного строго, так как была возможность использовать подстановочный знак ('.value (': * Envelope/*: Cube/*: Cube/*: Cube [@ *: currency = "USD"]/@ *: rate) [1] ',' nvarchar (max) ') '), но лучше яснее. Поэтому я бы избежал '//' в начале тоже ... – Shnugo

+0

@Shnugo Hi Shnugo! Действительно, * нужно выбрать *, возможно, слишком строгий. Я повторяю общие рекомендации, когда вы не знаете, существует ли несколько пространств имен, которые определяют одни и те же имена элементов. Но в этом случае только с одним пространством имен вы можете выбрать классификатор пространства имен подстановочных знаков. –