2014-11-24 180 views
0

我试图从SQL Server读取XML文件。我认为这是与命名空间的问题.. 这是我简单的XML的例子:SQL Server命名空间

<?xml version="1.0"?> 
<ArrayOfStatistica xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://schemas.datacontract.org/2004/07/LiveUpdateWS"> 
    <Statistica> 
     <BuildFinale>68</BuildFinale> 
     <BuildIniziale>1</BuildIniziale> 
     <DataInserimento>2014-11-21T09:34:25.387</DataInserimento> 
     <IdCliente>-1</IdCliente> 
     <IdOperazione>4</IdOperazione> 
     <IdRivenditore>-1</IdRivenditore> 
     <IdTipoProdotto>-1</IdTipoProdotto> 
     <IdUtente>2</IdUtente> 
     <IdVersione>3</IdVersione> 
    </Statistica> 
    <Statistica> 
     <BuildFinale>68</BuildFinale> 
     <BuildIniziale>1</BuildIniziale> 
     <DataInserimento>2014-11-21T09:37:43.84</DataInserimento> 
     <IdCliente>-1</IdCliente> 
     <IdOperazione>4</IdOperazione> 
     <IdRivenditore>-1</IdRivenditore> 
     <IdTipoProdotto>-1</IdTipoProdotto> 
     <IdUtente>2</IdUtente> 
     <IdVersione>3</IdVersione> 
    </Statistica> 
</ArrayOfStatistica> 

用下面的代码:

;WITH XMLNAMESPACES ('http://schemas.datacontract.org/2004/07/LiveUpdateWS"' AS ArrayOfStatistica) 
SELECT 
    (SELECT Child.value('(IdStatistica)[1]', 'bigint')),  
    (SELECT Child.value('(IdUtente)[1]', 'int')),  
    (CASE WHEN Child.value('(IdRivenditore)[1]', 'int') = -1 THEN NULL else (SELECT Child.value('(IdRivenditore)[1]', 'int')) end),  
    (CASE WHEN Child.value('(IdCliente)[1]', 'int') = -1 THEN NULL else (SELECT Child.value('(IdCliente)[1]', 'int')) end), 
    (SELECT Child.value('(DataInserimento)[1]', 'datetime')),    
    (CASE WHEN Child.value('(IdTipoProdotto)[1]', 'int') = -1 THEN NULL else (SELECT Child.value('(IdTipoProdotto)[1]', 'int')) end), 
    (SELECT Child.value('(IdVersione)[1]', 'int')), 
    (SELECT Child.value('(BuildIniziale)[1]', 'bigint')), 
    (SELECT Child.value('(BuildFinale)[1]', 'bigint')), 
    (SELECT Child.value('(IdOperazione)[1]', 'int')) 

    FROM 
    @xmlfile.nodes('ArrayOfStatistica/Statistica') AS N(Child) 

我没有得到任何选择值。

我应该如何设置这个XML文件的命名空间? 如果我删除了XML命名空间的线(http://schemas.datacontract.org/2004/07/LiveUpdateWS “的xmlns:I =” http://www.w3.org/2001/XMLSchema -instance“>) 一切工作正常

+1

为什么你有'(SELECT Child.value(...))'而不是仅仅是'Child.value(...)'?你为什么觉得你需要命名空间? (我的意思是,如果没有它,那就去没有它?) – 2014-11-24 17:34:14

回答

1

嗯,如果。您使用WITH XMLNAMESPACES,那么你要么定义地没有使用一个明确的前缀应用了默认 XML命名空间,或者你定义了前缀,你需要在你的XPath表达式使用XML命名空间。

要使用默认 XML命名空间,请使用这样的说法:

;WITH XMLNAMESPACES (DEFAULT 'http://schemas.datacontract.org/2004/07/LiveUpdateWS') 

,然后您现有的XPath表达式(不加任何前缀)应该工作。

如果定义前缀,当你不得不使用,在你的XPath表达式前缀!

;WITH XMLNAMESPACES ('http://schemas.datacontract.org/2004/07/LiveUpdateWS' AS ns) 

SELECT 
    Child.value('(ns:IdStatistica)[1]', 'bigint'),  
    Child.value('(ns:IdUtente)[1]', 'int'),  
    .......  
FROM 
    @xmlfile.nodes('ns:ArrayOfStatistica/ns:Statistica') AS N(Child) 
0

考虑到所有的因素都在命名空间http://schemas.datacontract.org/2004/07/LiveUpdateWS,您可以使用DEFAULT(还要注意错别字在您的命名空间 - 你有一个额外尾随"

;WITH XMLNAMESPACES (DEFAULT 'http://schemas.datacontract.org/2004/07/LiveUpdateWS') 
SELECT 
    (SELECT Child.value('(IdStatistica)[1]', 'bigint')),  
    (SELECT Child.value('(IdUtente)[1]', 'int')),  
    (CASE WHEN Child.value('(IdRivenditore)[1]', 'int') = -1 THEN NULL else (SELECT Child.value('(IdRivenditore)[1]', 'int')) end),  
    (CASE WHEN Child.value('(IdCliente)[1]', 'int') = -1 THEN NULL else (SELECT Child.value('(IdCliente)[1]', 'int')) end), 
    (SELECT Child.value('(DataInserimento)[1]', 'datetime')),    
    (CASE WHEN Child.value('(IdTipoProdotto)[1]', 'int') = -1 THEN NULL else (SELECT Child.value('(IdTipoProdotto)[1]', 'int')) end), 
    (SELECT Child.value('(IdVersione)[1]', 'int')), 
    (SELECT Child.value('(BuildIniziale)[1]', 'bigint')), 
    (SELECT Child.value('(BuildFinale)[1]', 'bigint')), 
    (SELECT Child.value('(IdOperazione)[1]', 'int')) 
    FROM 
    @xmlfile.nodes('ArrayOfStatistica/Statistica') AS N(Child)