У меня есть 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
+1 с моей стороны. Просто упомянуть: * нужно выбрать *, это немного строго, так как была возможность использовать подстановочный знак ('.value (': * Envelope/*: Cube/*: Cube/*: Cube [@ *: currency = "USD"]/@ *: rate) [1] ',' nvarchar (max) ') '), но лучше яснее. Поэтому я бы избежал '//' в начале тоже ... – Shnugo
@Shnugo Hi Shnugo! Действительно, * нужно выбрать *, возможно, слишком строгий. Я повторяю общие рекомендации, когда вы не знаете, существует ли несколько пространств имен, которые определяют одни и те же имена элементов. Но в этом случае только с одним пространством имен вы можете выбрать классификатор пространства имен подстановочных знаков. –