2011-11-15 1 views
1

Я действительно новичок в XMl и мне было поручено извлечь некоторые значения из столбца XML.Может ли кто-нибудь помочь? Извлечение значений из XML (SOAP) в SQL Server 2008

Я прочитал много примеров того, как это сделать в Интернете и здесь, и попробовал несколько разных методов. Пока я могу заставить их работать, они возвращают только нулевые значения, поэтому ясно, что что-то не так. Единственное различие, которое я вижу, это то, что в нашем 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 и сделать это для каждого пользователя.

Любая помощь или идеи, которые были бы очень полезными!

С уважением

Джули

ответ

0

Не на самом деле понять, что делает ваш первый запрос. Но второй будет работать, если вы удалите item[1]/ из xpath, где вы извлекаете значения.

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 
+0

Это здорово спасибо! Я разместил его на другом форуме, и кто-то ответил тем же, что и вы, и теперь это работает! Большое спасибо за то, что вы вернулись ко мне! – JYatesDBA

Смежные вопросы