2016-11-05 80 views
2

我有一个存储在SQL表中的XML文件。现在我想用SQL读取z特定的元素值。从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从我身边。 (*:Envelope/*:Cube/*:Cube/*:Cube [@ *:Cube/*:Cube/*:货币=“美元”]/@ *:率)[1]','nvarchar(max)')'),但更明确更好。因此,我会在开始时避开'//'...... – Shnugo

+0

@Shnugo Hi Shnugo!确实,*需要选择*可能有点太严格。当您不知道是否有多个定义相同元素名称的名称空间时,我回应了一般性建议。但在这种情况下,只有一个名称空间可以选择通配符命名空间限定符。 –