Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 1с веб-севвис, параметр xpath_namespaces в sp_xml_preparedocument  [new]
ъ
Guest
Приветствую всех !

получаю из 1С веб-сервиса данные,
а вот с разбором их какой-то затык
+

declare @XML xml
declare @hDoc int

set @XML = 
'<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Header />
  <soap:Body>
    <m:GetRemainsResponse xmlns:m="ABC">
      <m:return xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Запись xmlns="http://abc">
          <name>name1</name>
          <price>548.5</price>
        </Запись>
        <Запись xmlns="http://abc">
          <name>name2</name>
          <price>234.8</price>
        </Запись>
      </m:return>
    </m:GetRemainsResponse>
  </soap:Body>
</soap:Envelope>'

exec sp_xml_preparedocument @hDoc output, @XML , 
'<ROOT xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:m="DPO" />'


select * 
from openxml(@hDoc, '/soap:Envelope/soap:Body/m:GetRemainsResponse/m:return/Запись',3)
with
(
	name			varchar(50)	       'name',
	price			float		       'price'
)

exec sp_xml_removedocument @hDoc

name                                               price
-------------------------------------------------- ----------------------

(строк обработано: 0)


поискал по форуму, - нашел, что нужно использовать параметр xpath_namespaces в sp_xml_preparedocument,
но вот что в этом параметре должно быть для тега <Запись xmlns="http://abc"> ??
и что это вообще такое ? ))

если из тега убрать xmlns="http://abc", - то всё замечательно функционирует...
+

declare @XML xml
declare @hDoc int

set @XML = 
'<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Header />
  <soap:Body>
    <m:GetRemainsResponse xmlns:m="ABC">
      <m:return xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Запись>
          <name>name1</name>
          <price>548.5</price>
        </Запись>
        <Запись>
          <name>name2</name>
          <price>234.8</price>
        </Запись>
      </m:return>
    </m:GetRemainsResponse>
  </soap:Body>
</soap:Envelope>'

exec sp_xml_preparedocument @hDoc output, @XML , 
'<ROOT xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:m="ABC" />'


select * 
from openxml(@hDoc, '/soap:Envelope/soap:Body/m:GetRemainsResponse/m:return/Запись',3)
with
(
	name			varchar(50)	       'name',
	price			float		       'price'
)

exec sp_xml_removedocument @hDoc 

name                                               price
-------------------------------------------------- ----------------------
name1                                              548,5
name2                                              234,8

(строк обработано: 2)

научите глупого :)

или может можно это всё сделать через XQuery ?

спасибо !
select @@version
------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Server 2005 - 9.00.1406.00 (Intel X86) 
	Mar  3 2007 18:40:02 
	Copyright (c) 1988-2005 Microsoft Corporation
	Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
8 ноя 11, 15:29    [11564313]     Ответить | Цитировать Сообщить модератору
 Re: 1с веб-севвис, параметр xpath_namespaces в sp_xml_preparedocument  [new]
ъ
Guest
ого я вопросы задаю ! :)
...или вопрос-кривой ?

навсякей, кусок 1с-вского wsdl
  <?xml version="1.0" encoding="UTF-8" ?> 
- <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap12bind="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soapbind="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="ABC" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd1="ABC" xmlns:xsd2="http://abc" name="ABC" targetNamespace="ABC">
- <types>
- <xs:schema xmlns:tns="http://abc" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://abc" attributeFormDefault="unqualified" elementFormDefault="qualified">
- <xs:complexType name="Запись">
- <xs:sequence>
  <xs:element name="name" type="xs:string" /> 
  <xs:element name="price" type="xs:decimal" nillable="true" /> 
  </xs:sequence>
  </xs:complexType>
- <xs:complexType name="СписокЗаписей">
- <xs:sequence>
  <xs:element name="Запись" type="tns:Запись" minOccurs="0" maxOccurs="unbounded" /> 
  </xs:sequence>
  </xs:complexType>
  </xs:schema>
8 ноя 11, 16:46    [11565030]     Ответить | Цитировать Сообщить модератору
 Re: 1с веб-севвис, параметр xpath_namespaces в sp_xml_preparedocument  [new]
ъ
Guest
вообщем, пока решил проблему "по-джедайски" :)
SET TEXTSIZE 2147483647;
INSERT @TResponse
EXEC @ErrCode = sys.sp_OAGetProperty @OLEHTTP ,'responseText'
-- 
update @TResponse
set Response = replace(Response, '<Запись xmlns="http://dpo">', '<Запись>')
--
SELECT @Response = Convert(XML,Stuff(Response,1,IsNull(NullIf(CharIndex('?>',Response),0)+1,0),'')) FROM @TResponse
-- ....
но, вдруг у кого есть менее "наркоманский" вариант,
буду рад видеть ...
8 ноя 11, 20:06    [11566113]     Ответить | Цитировать Сообщить модератору
 Re: 1с веб-севвис, параметр xpath_namespaces в sp_xml_preparedocument  [new]
ъ
Guest
вот оно "оказуица" как надо было ))
(очень в тему iljy тут "недалеко" 12126088 ответил))) - спасибо, пригодилось ! )
declare @XML xml

set @XML = 
'<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Header />
  <soap:Body>
    <m:GetRemainsResponse xmlns:m="ABC">
      <m:return xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Запись xmlns="http://abc">
          <name>name1</name>
          <price>548.5</price>
        </Запись>
        <Запись xmlns="http://abc">
          <name>name2</name>
          <price>234.8</price>
        </Запись>
      </m:return>
    </m:GetRemainsResponse>
  </soap:Body>
</soap:Envelope>'

;with XMLNAMESPACES ('http://www.w3.org/2003/05/soap-envelope' as soap, 'ABC' as m, default 'http://abc')
select 
	t.c.value('./name[1]', 'nvarchar(1000)') as name,
	t.c.value('./price[1]', 'float') as price
from @XML.nodes('/soap:Envelope/soap:Body/m:GetRemainsResponse/m:return/Запись') as t(c)

nameprice
name1548,5
name2234,8
20 фев 12, 20:38    [12126280]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить