извлечь soap xml значение тега, содержащее несколько пространств имен и другой атрибут в SQL Завершить - PullRequest
0 голосов
/ 03 мая 2020

Ниже приведен пример SOAP xml и запрос для извлечения значения -

DECLARE @xml XML='<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <xsi:MaintenanceOrder xmlns:xsi="http://schema.xyz.com/abc/2" xmlns:ush="http://www.xyz.nl/abc" xmlns:xsj="http://www.w3.org/2001/XMLSchema-instance" languageCode="en-US" releaseID="9.2" systemEnvironmentCode="Production" versionID="2.8.0">
   <xsi:DataArea>
    <xsi:MaintenanceOrder>
     <xsi:MaintenanceOrderHeader>
      <xsi:UserArea>
       <xsi:Property>
        <xsi:NameValue accountingEntity="*" listID="*" name="OrderDate" type="DATE">2020-03-30T00:00:00</xsi:NameValue>
       </xsi:Property>
       <xsi:Property>
        <xsi:NameValue accountingEntity="*" listID="*" name="ReportDate" type="DATE">2020-04-30T00:00:00</xsi:NameValue>
       </xsi:Property>
      </xsi:UserArea>
     </xsi:MaintenanceOrderHeader>
    </xsi:MaintenanceOrder>
   </xsi:DataArea>
  </xsi:MaintenanceOrder>
 </soapenv:Body>
</soapenv:Envelope>'
select A.r.value('(xsi:NameValue[@name="OrderDate"])[1]','date') as "OrderDate"
,A.r.value('(xsi:NameValue[@name="ReportDate"])[1]','date') as "ReportDate"
FROM @xml.nodes('/*:Envelope/*:Body/*:MaintenanceOrder/*:DataArea/*:MaintenanceOrder/*:MaintenanceOrderHeader/*:UserArea/*:Property') AS A(r)

выпуск 1 - путем удаления пространства имен только в MaintenanceOrder, после чего запрос возвращает значение, в противном случае возвращается ноль.

выпуск 2 - необходим вывод в виде одной строки с несколькими значениями тегов, но запрос дает несколько строк.

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 03 мая 2020

Попробуйте использовать with xmlnamespaces объявления и явные пути, чтобы ваши запросы XPath соответствовали только тем элементам, которые вы ожидаете - и выполняли их так, как этого можно ожидать.

Например:

declare @xml xml =
N'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <xsi:MaintenanceOrder xmlns:xsi="http://schema.xyz.com/abc/2" xmlns:ush="http://www.xyz.nl/abc" xmlns:xsj="http://www.w3.org/2001/XMLSchema-instance" languageCode="en-US" releaseID="9.2" systemEnvironmentCode="Production" versionID="2.8.0">
   <xsi:DataArea>
    <xsi:MaintenanceOrder>
     <xsi:MaintenanceOrderHeader>
      <xsi:UserArea>
       <xsi:Property>
        <xsi:NameValue accountingEntity="*" listID="*" name="OrderDate" type="DATE">2020-03-30T00:00:00</xsi:NameValue>
       </xsi:Property>
       <xsi:Property>
        <xsi:NameValue accountingEntity="*" listID="*" name="ReportDate" type="DATE">2020-04-30T00:00:00</xsi:NameValue>
       </xsi:Property>
      </xsi:UserArea>
     </xsi:MaintenanceOrderHeader>
    </xsi:MaintenanceOrder>
   </xsi:DataArea>
  </xsi:MaintenanceOrder>
 </soapenv:Body>
</soapenv:Envelope>';

with xmlnamespaces (
  'http://schemas.xmlsoap.org/soap/envelope/' as s11,
  'http://schema.xyz.com/abc/2' as abc
)
select
  A.r.value('(abc:Property/abc:NameValue[@name="OrderDate"])[1]','date') as "OrderDate",
  A.r.value('(abc:Property/abc:NameValue[@name="ReportDate"])[1]','date') as "ReportDate"
from @xml.nodes('/s11:Envelope/s11:Body/abc:MaintenanceOrder/abc:DataArea/abc:MaintenanceOrder/abc:MaintenanceOrderHeader/abc:UserArea') as A(r);

Возвращает ожидаемые значения в одной строке:

OrderDate   ReportDate
2020-03-30  2020-04-30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...