﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>SQLServerCentral / SQL Server 2008 / SQL Server 2008 - General  / XML + SOAP / Latest Posts</title><generator>InstantForum.NET v2.9.0</generator><description>SQLServerCentral</description><link>http://www.sqlservercentral.com/Forums/</link><webMaster>notifications@sqlservercentral.com</webMaster><lastBuildDate>Mon, 20 May 2013 19:34:30 GMT</lastBuildDate><ttl>20</ttl><item><title>RE: XML + SOAP</title><link>http://www.sqlservercentral.com/Forums/Topic920046-391-1.aspx</link><description>Here's a stored procedure that you can use to parse XML. The first example inside the procedure is the XML posted by the original OP. I've included a more comprehensive example so one can see how nodes, properties, and data are parsed into a table.This procedure was designed to run basically one XML input at a time so it may not be optimally efficient when used to parse large batches with large amounts of data. In such case I'd recommend using XQUERY. There's lots of articles on XQUERY on this site. But for a basic XML parser, try this:[code="sql"]CREATE PROCEDURE dbo.ParseXML     @strXML NVARCHAR(MAX)    ,@schemanode NVARCHAR(255)    ,@rootnode NVARCHAR(255)ASBEGIN    /*    SAMPLE PARAMETERS        EXEC dbo.ParseXML        N'&amp;lt;somaResponse xmlns:ns="http://sum.com"&amp;gt;&amp;lt;ns:return&amp;gt;3&amp;lt;/ns:return&amp;gt;&amp;lt;/somaResponse&amp;gt;'        ,'root'        ,'/somaResponse'    EXEC dbo.ParseXML        N'&amp;lt;soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&amp;gt;          &amp;lt;soapenv:Body&amp;gt;            &amp;lt;Reports xmlns="http://www.sample.com/schemas"&amp;gt;              &amp;lt;ReportWrapper type="report"&amp;gt;                &amp;lt;TransactionID&amp;gt;123456789&amp;lt;/TransactionID&amp;gt;                &amp;lt;ReportHeader&amp;gt;                  &amp;lt;ReportName /&amp;gt;                  &amp;lt;DistrictContacts&amp;gt;                    &amp;lt;District ContactName="North"&amp;gt;George Washington&amp;lt;/District&amp;gt;                    &amp;lt;District ContactName="South"&amp;gt;John Adams&amp;lt;/District&amp;gt;                    &amp;lt;District ContactName="East"&amp;gt;Thomas Jefferson&amp;lt;/District&amp;gt;                    &amp;lt;District ContactName="West"&amp;gt;James Madison&amp;lt;/District&amp;gt;                  &amp;lt;/DistrictContacts&amp;gt;                &amp;lt;/ReportHeader&amp;gt;                &amp;lt;Management&amp;gt;                  &amp;lt;ManagerName type="subject"&amp;gt;                    &amp;lt;Prefix&amp;gt;Mr&amp;lt;/Prefix&amp;gt;                    &amp;lt;FirstName&amp;gt;John&amp;lt;/FirstName&amp;gt;                    &amp;lt;SurName&amp;gt;Dilinger&amp;lt;/SurName&amp;gt;                    &amp;lt;Suffix /&amp;gt;                  &amp;lt;/ManagerName&amp;gt;                  &amp;lt;DemographicDetail&amp;gt;                    &amp;lt;GovernmentId issuingAuthority="SSN"&amp;gt;111-11-1111&amp;lt;/GovernmentId&amp;gt;                    &amp;lt;DateOfBirth&amp;gt;02/03/1984&amp;lt;/DateOfBirth&amp;gt;                    &amp;lt;Gender&amp;gt;M&amp;lt;/Gender&amp;gt;                  &amp;lt;/DemographicDetail&amp;gt;                &amp;lt;/Management&amp;gt;              &amp;lt;/ReportWrapper&amp;gt;            &amp;lt;/Reports&amp;gt;          &amp;lt;/soapenv:Body&amp;gt;        &amp;lt;/soapenv:Envelope&amp;gt;'        ,'Reports'        ,'/ReportWrapper'        */    SET NOCOUNT ON    DECLARE        @idoc INT       ,@id INT       ,@parentid INT       ,@SoapEnvOpen NVARCHAR(MAX)       ,@SoapEnvClose NVARCHAR(MAX)       ,@SoapBodyOpen NVARCHAR(MAX)       ,@SoapBodyClose NVARCHAR(MAX)       ,@SchemaNodeOpen NVARCHAR(MAX)       ,@SchemaNodeClose NVARCHAR(MAX)       ,@checkSoap INT       ,@checkSchema INT       ,@checkXMLHeader INT       ,@XMLHeader NVARCHAR(MAX)          IF OBJECT_ID('tempdb..#ChildList') IS NOT NULL    DROP TABLE #ChildList    CREATE TABLE #ChildList (        [RowNum] INT IDENTITY(1,1) NOT NULL,        [parentid] INT NULL,        [id] INT NULL,        PRIMARY KEY (RowNum),        UNIQUE (RowNum))            IF OBJECT_ID('tempdb..#NodeList') IS NOT NULL    DROP TABLE #NodeList    CREATE TABLE #NodeList (        [RowNum] INT NOT NULL,        [id] INT NULL,        [parentid] INT NULL,        [nodetype] INT NULL,        [localname] NVARCHAR(MAX) NULL,        [text] NVARCHAR(MAX) NULL,        PRIMARY KEY (RowNum),        UNIQUE (RowNum))    SET @id = 1    SET @parentid = NULL                    /* Check to see if any XML exists */        SET @strXML = NULLIF(@strXML,'')        IF @strXML IS NULL        BEGIN                    SELECT                NULL AS RowNum               ,NULL AS id               ,NULL AS parentid               ,NULL AS nodepath               ,NULL AS nodetype               ,NULL AS nodename               ,NULL AS property               ,NULL AS value               ,NULL AS nodecontents               ,'No XML to process' AS XMLStatus                                        RETURN                    END     ELSE        BEGIN                -- Get rid of tabs, extra spaces, and other extraneous characters                            IF CHARINDEX('&amp;lt;',@strXML,1) &amp;gt; 0                BEGIN                    SET @strXML = REPLACE(@strXML,'&amp;lt;','&amp;lt;')                    SET @strXML = REPLACE(@strXML,'&amp;gt;','&amp;gt;')                END            SET @strXML = REPLACE(@strXML,CHAR(9),'    ')        -- convert tabs to spaces            SET @strXML =             REPLACE(                    REPLACE(                        REPLACE(                            @strXML                        ,'  ',' '+CHAR(7))                    ,CHAR(7)+' ','')                ,CHAR(7),'')                            SET @strXML = REPLACE(@strXML,'&amp;gt; &amp;lt;','&amp;gt;&amp;lt;')        END            /* Check to see if the XML has a header */        SET @checkXMLHeader = CHARINDEX('&amp;lt;?xml version',@strXML,0)    /* If the XML has a header then remove it */    IF @checkXMLHeader &amp;gt; 0        BEGIN                    SET @XMLHeader = SUBSTRING(@strXML,CHARINDEX('&amp;lt;?xml version',@strXML,0),CHARINDEX('&amp;gt;',@strXML,0))            SET @strXML = REPLACE(@strXML,@XMLHeader,'')        END            /* Check to see if the XML has a SOAP wrapper */        SET @checkSoap = CHARINDEX('&amp;lt;soapenv:Envelope',@strXML,0)    /* If the XML has a SOAP wrapper then remove it */    IF @checkSoap &amp;gt; 0        BEGIN                    SET @SoapEnvOpen = SUBSTRING(@strXML,CHARINDEX('&amp;lt;soapenv:Envelope',@strXML,0),CHARINDEX('&amp;gt;',@strXML,0))            SET @strXML = REPLACE(@strXML,@SoapEnvOpen,'')            SET @SoapBodyOpen = SUBSTRING(@strXML,CHARINDEX('&amp;lt;soapenv:Body',@strXML,0),CHARINDEX('&amp;gt;',@strXML,0))            SET @strXML = REPLACE(@strXML,@SoapBodyOpen,'')            SET @SoapEnvClose = SUBSTRING(@strXML,CHARINDEX('&amp;lt;/soapenv:Envelope&amp;gt;',@strXML,0),LEN('&amp;lt;/soapenv:Envelope&amp;gt;'))            SET @strXML = REPLACE(@strXML,@SoapEnvClose,'')            SET @SoapBodyClose = SUBSTRING(@strXML,CHARINDEX('&amp;lt;/soapenv:Body&amp;gt;',@strXML,0),LEN('&amp;lt;/soapenv:Body&amp;gt;'))            SET @strXML = REPLACE(@strXML,@SoapBodyClose,'')        END    /* Check to see if the XML has a schema definition node */        SET @checkSchema = CHARINDEX('&amp;lt;'+@schemanode,@strXML,0)    /* If a schema definition node exists remove it */        IF @checkSchema &amp;gt; 0        BEGIN                SET @SchemaNodeOpen = SUBSTRING(@strXML,CHARINDEX('&amp;lt;'+@schemanode,@strXML,0),CHARINDEX('&amp;gt;',@strXML,0))            SET @strXML = REPLACE(@strXML,@SchemaNodeOpen,'')            SET @SchemaNodeClose = SUBSTRING(@strXML,CHARINDEX('&amp;lt;/'+@schemanode+'&amp;gt;',@strXML,0),LEN('&amp;lt;/'+@schemanode+'&amp;gt;'))            SET @strXML = REPLACE(@strXML,@SchemaNodeClose,'')        END            BEGIN TRY        EXEC sp_xml_preparedocument @idoc OUTPUT, @strXML    END TRY    BEGIN CATCH        BEGIN                        SELECT                NULL AS RowNum               ,NULL AS id               ,NULL AS parentid               ,NULL AS nodepath               ,NULL AS nodetype               ,NULL AS nodename               ,NULL AS property               ,NULL AS value               ,NULL AS nodecontents               ,'Invalid XML' AS XMLStatus                RETURN                            END    END CATCH            /* Parse the XML to get the nodes */    ;WITH cte    AS (        SELECT              CAST(p1.parentid AS INT) AS parentid            ,CAST(p1.id AS INT) AS id        FROM            OPENXML (@idoc,@rootnode,2) AS p1        UNION ALL        SELECT              CAST(p2.parentid AS INT) AS parentid            ,CAST(p2.id AS INT) AS id        FROM            OPENXML (@idoc,@rootnode,2) AS p2        JOIN             cte            ON CAST(cte.id AS INT) = CAST(p2.ParentID AS INT)        WHERE            CAST(p2.parentid AS INT) = @parentid            )    INSERT INTO #ChildList    SELECT *     FROM cte            /* Parse the nodes to get the data */            INSERT INTO #NodeList    SELECT          #ChildList.RowNum        ,xmllist.id         ,xmllist.parentid        ,xmllist.nodetype        ,xmllist.localname        ,CAST(xmllist.[text] AS NVARCHAR(MAX)) AS [text]    FROM #ChildList    INNER JOIN         OPENXML (@idoc,@rootnode,2) AS xmllist        ON #ChildList.id = xmllist.id      WHERE        #ChildList.RowNum &amp;gt; 0    /* Display the formatted results */    ;WITH RecursiveNodes(RowNum,id,parentid,nodepath,localname,[text],nodetype)    AS (        SELECT             #NodeList.RowNum            ,#NodeList.id            ,#NodeList.parentid            ,CAST('/' + REPLACE(REPLACE(REPLACE(REPLACE(#NodeList.localname,'&amp;',''),'?',''),' ',''),'.','') AS NVARCHAR(255)) AS nodepath            ,#NodeList.localname            ,CAST(#NodeList.[text] AS NVARCHAR(MAX)) AS [text]            ,0 AS nodetype        FROM #ChildList        INNER JOIN             #NodeList            ON #ChildList.id = #NodeList.id         WHERE            #NodeList.parentid IS NULL            AND #ChildList.RowNum &amp;gt; 0            AND #NodeList.RowNum &amp;gt; 0        UNION ALL        SELECT             n.RowNum            ,n.id            ,n.parentid            ,CAST(r.nodepath + '/'+ REPLACE(REPLACE(REPLACE(REPLACE(n.localname,'&amp;',''),'?',''),' ',''),'.','') AS NVARCHAR(255)) AS nodepath            ,n.localname            ,n.[text]            ,n.nodetype        FROM #NodeList AS n        INNER JOIN             RecursiveNodes AS r            ON n.parentid = r.id        WHERE            n.RowNum &amp;gt; 0            AND r.RowNum &amp;gt; 0            AND n.parentid &amp;gt;= 0      )    SELECT        ROW_NUMBER() OVER (ORDER BY Result.RowNum) AS RowNum       ,Result.id       ,Result.parentid       ,Result.nodepath       ,Result.nodetype       ,Result.nodename       ,Result.property       ,Result.value       ,Result.nodecontents       ,'OK' AS XMLStatus    FROM        (        SELECT            rn.RowNum           ,rn.id           ,rn.parentid           ,rn.nodepath           ,(CASE                WHEN rn.nodetype = 0 THEN 'Root'                WHEN rn.nodetype = 1 THEN 'Node'                WHEN rn.nodetype = 2 THEN 'Property'                ELSE 'Data'             END) AS nodetype           ,(CASE                WHEN rn.nodetype = 0 THEN rn.localname                WHEN rn.nodetype = 1 THEN rn.localname                WHEN rn.nodetype = 2 THEN (SELECT TOP(1) localname FROM RecursiveNodes WHERE id = rn.parentid)                ELSE NULL             END) AS nodename           ,(CASE                WHEN rn.nodetype = 2 THEN rn.localname                ELSE NULL             END) AS property           ,(CASE                WHEN rn.nodetype = 2 THEN (SELECT TOP(1) [text] FROM RecursiveNodes WHERE parentid = rn.id)                ELSE NULL             END) AS value                    ,(CASE                WHEN rn.nodetype = 1 THEN (SELECT TOP(1) [text] FROM RecursiveNodes WHERE parentid = rn.id)                WHEN rn.nodetype = 2 THEN (SELECT TOP(1) [text] FROM RecursiveNodes WHERE parentid = rn.parentid and [text] is not null)                ELSE NULL             END) AS nodecontents            FROM            RecursiveNodes AS rn        WHERE            rn.localname &amp;lt;&amp;gt; '#text'        ) AS ResultEND[/code]</description><pubDate>Mon, 15 Oct 2012 14:49:18 GMT</pubDate><dc:creator>Steven Willis</dc:creator></item><item><title>RE: XML + SOAP</title><link>http://www.sqlservercentral.com/Forums/Topic920046-391-1.aspx</link><description>Hi.How can i parse this xml (I invoke a webservice and i got this return):&amp;lt;ns:somaResponse xmlns:ns="http://sum.com"&amp;gt;&amp;lt;ns:return&amp;gt;3&amp;lt;/ns:return&amp;gt;&amp;lt;/ns:somaResponse&amp;gt;I used this example (from this post), but doesn't work.Anyone can help me ?Thanks</description><pubDate>Sun, 14 Oct 2012 18:56:35 GMT</pubDate><dc:creator>mob.zanotti</dc:creator></item><item><title>RE: XML + SOAP</title><link>http://www.sqlservercentral.com/Forums/Topic920046-391-1.aspx</link><description>Sorry, I found out...[code="sql"]if object_id('tempdb.dbo.#Temp') is not null	drop table dbo.#Temp	CREATE TABLE #Temp (col xml)INSERT #Temp (col)select '&amp;lt;?xml version="1.0"?&amp;gt;&amp;lt;soap:Envelopexmlns:soap="http://www.w3.org/2001/12/soap-envelope"soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"&amp;gt;	&amp;lt;soap:Body xmlns:m="http://www.example.org/stock"&amp;gt;	  &amp;lt;m:GetStockPrice&amp;gt;		&amp;lt;m:StockName&amp;gt;0.018&amp;lt;/m:StockName&amp;gt;	  &amp;lt;/m:GetStockPrice&amp;gt;	&amp;lt;/soap:Body&amp;gt;&amp;lt;/soap:Envelope&amp;gt;';WITH XMLNAMESPACES ( 'http://www.w3.org/2001/12/soap-envelope'  as "soap",  'http://www.example.org/stock'  as "m")select T.c.value('m:StockName[1]','decimal(8,3)')from #Tempcross apply col.nodes('soap:Envelope/soap:Body/m:GetStockPrice') AS T(c)[/code]</description><pubDate>Tue, 11 May 2010 15:34:46 GMT</pubDate><dc:creator>fayilt</dc:creator></item><item><title>XML + SOAP</title><link>http://www.sqlservercentral.com/Forums/Topic920046-391-1.aspx</link><description>Can you guys help me with this XML?[code="sql"]if object_id('tempdb.dbo.#Temp') is not null	drop table dbo.#Temp	CREATE TABLE #Temp (col xml)INSERT #Temp (col)select '&amp;lt;?xml version="1.0"?&amp;gt;&amp;lt;soap:Envelopexmlns:soap="http://www.w3.org/2001/12/soap-envelope"soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"&amp;gt;	&amp;lt;soap:Body xmlns:m="http://www.example.org/stock"&amp;gt;	  &amp;lt;m:GetStockPrice&amp;gt;		&amp;lt;m:StockName&amp;gt;0.018&amp;lt;/m:StockName&amp;gt;	  &amp;lt;/m:GetStockPrice&amp;gt;	&amp;lt;/soap:Body&amp;gt;&amp;lt;/soap:Envelope&amp;gt;'select T.c.value('m:StockName[1]','decimal(8,3)')from #Tempcross apply col.nodes('soap:Envelope/soap:Body/m:GetStockPrice') AS T(c)[/code]I keep getting "The name "soap" does not denote a namespace." error.How do I access nodes with namespaces?Thanks</description><pubDate>Tue, 11 May 2010 15:16:34 GMT</pubDate><dc:creator>fayilt</dc:creator></item></channel></rss>