使用XML Namespace从XML中选择特定元素

时间:2016-11-05 12:51:00

标签: sql sql-server xml openrowset

我有一个存储在SQL表中的XML文件。现在我想用SQL读取z特定的元素值。

如果XML中没有namespace元素,我可以从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 个答案:

答案 0 :(得分: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;