读取带命名空间的xml文件

时间:2016-05-07 00:00:23

标签: sql sql-server xml tsql sql-server-2014

我们需要在sql server中读取一个xml文件,但是我们遇到了问题,因为xml有一个命名空间,我已经尝试了几个解决方案,但我无法解决问题。

xml文件看起来像这样

<?xml version="1.0" encoding="UTF-8"?>
<Status:orders xmlns:Status="http://www.test.com"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test.com Status.xsd">
  <order>
    <Header>
      <Name>500039</Name>
      <Letter>A</Letter> 
    </Header>
  </order>  
</Status:orders>

可以帮助您检索如何检索名称和字母标记的值

提前感谢。

1 个答案:

答案 0 :(得分:0)

您的朋友被称为WITH XMLNAMESPACES ...

尝试这样

DECLARE @xml XML=
'<?xml version="1.0" encoding="UTF-8"?>
<Status:orders xmlns:Status="http://www.test.com"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test.com Status.xsd">
  <order>
    <Header>
      <Name>500039</Name>
      <Letter>A</Letter> 
    </Header>
  </order>  
</Status:orders>';

WITH XMLNAMESPACES('http://www.test.com' AS Status)
SELECT @xml.value('(/Status:orders/order/Header/Name)[1]','int')
      ,@xml.value('(/Status:orders/order/Header/Letter)[1]','varchar(max)');

另一种方法是使用星号。

SELECT @xml.value('(/*:orders/order/Header/Name)[1]','int')
      ,@xml.value('(/*:orders/order/Header/Letter)[1]','varchar(max)');

另一种选择是:

SELECT @xml.value('(//Name)[1]','int')
      ,@xml.value('(//Letter)[1]','varchar(max)');

但总的来说,尽可能具体,这是一个很好的建议......