谁能帮忙?从SQL Server 2008中的XML(SOAP)中提取值

时间:2011-11-15 09:41:06

标签: xml sql-server-2008 soap

我是XMl的新手,我的任务是从XML列中提取一些值。

我已经阅读了很多关于如何在互联网上和此处进行此操作的示例,并尝试了几种不同的方法。虽然我可以让它们工作,但它们只返回空值,所以显然有些事情是不对的。我能看到的唯一区别是,在我们的XML代码中,他们使用SOAP。以前的开发人员编写了代码,所以我不能问他们。

这些是我尝试过的方法:


SELECT
  settings.value('item[1]/_value[1]', 'int') as PrinterId
      FROM dbo.usersettings 
    where userid = 2156

----------------------------------------------------------------------------------

 create table XMLPrinters (PrinterList xml)
   insert XMLPrinters select settings 
       from dbo.UserSettings
            where userid = 2156

select 
    r.p.value ('item[1]/_key[1]', 'nvarchar (50)') as PrinterType,
    r.p.value ('item[1]/_value[1]', 'int') as PrinterId 
from XMLPrinters 
    cross apply printerlist.nodes ('//item') r(p)

正如我所说的,我对XML非常陌生并且不是来自编码背景,所以可能有一些我缺少的东西,但XML代码似乎不适合我在网上看到的其他格式,我想这可能是由于SOAP。

代码本身长度为2496行,但这是从一开始的提取,我试图从中提取值:

         <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                             xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
               xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
               xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
               xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" 
               SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<SOAP-ENC:Array SOAP-ENC:arrayType="xsd:anyType[5]">
  <item xmlns:a2="http://schemas.microsoft.com/clr/ns/System.Collections"                     xsi:type="a2:DictionaryEntry">
    <_key xsi:type="xsd:string">primaryprinter</_key>
    <_value xsi:type="xsd:anyType" xsi:null="1" />
  </item>

  <item xmlns:a2="http://schemas.microsoft.com/clr/ns/System.Collections" xsi:type="a2:DictionaryEntry">
    <_key xsi:type="xsd:string">secondaryprinter</_key>
    <_value xsi:type="xsd:anyType" xsi:null="1" />
  </item>

  <item xmlns:a2="http://schemas.microsoft.com/clr/ns/System.Collections" si:type="a2:DictionaryEntry">
    <_key xsi:type="xsd:string">i18mminstancelabel</_key>
    <_value xsi:type="xsd:string">1056</_value>
  </item>

最后我需要做的是提取_value,其中_key = PrimaryPrinter并为每个用户执行此操作。

任何人的帮助或想法都会受到极大的欢迎!

此致

朱莉

1 个答案:

答案 0 :(得分:0)

实际上并不了解您的第一个查询的作用。但是,如果从获取值的xpath中删除item[1]/,则第二个将起作用。

select 
    r.p.value ('_key[1]', 'nvarchar (50)') as PrinterType,
    r.p.value ('_value[1]', 'int') as PrinterId 
from XMLPrinters 
    cross apply printerlist.nodes ('//item') r(p)

使用您提供的XML的结果:

PrinterType                                        PrinterId
-------------------------------------------------- -----------
primaryprinter                                     0
secondaryprinter                                   0
i18mminstancelabel                                 1056