我试图从SQL Server读取XML文件。我认为这是Namespace的一个问题.. 这是我简单的XML的一个例子:
<?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)
我没有从SELECT获得任何价值。
我应该如何设置此xml文件的命名空间? 如果我删除XML命名空间的行
<ArrayOfStatistica xmlns =
"http://schemas.datacontract.org/2004/07/LiveUpdateWS" xmlns: i =
"http://www.w3.org/2001/XMLSchema -instance ">
一切正常。
答案 0 :(得分:1)
好吧,如果您使用WITH XMLNAMESPACES
,那么您 定义默认 XML命名空间,该命名空间可以在不使用显式前缀的情况下应用,或者您定义XML您需要在XPath表达式中使用前缀的命名空间。
要使用默认 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)
答案 1 :(得分: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)