Проблема с вложенным пространством имен в T-SQL XQuery - PullRequest
0 голосов
/ 11 июня 2019

Я просто хочу фактическое время - это так много, чтобы спросить?

declare @x 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>
    <bogus>1934</bogus>
    <getJobActionsResponse xmlns="urn:JobService">
      <getJobActionsReturn>
        <job xmlns:ns1="urn:JobService" xsi:type="ns1:SvcJob">
          <actions />
          <actualEndTime>
            <dateString>2019-05-15 19:46:54.207</dateString>
          </actualEndTime>
        </job>
      </getJobActionsReturn>
    </getJobActionsResponse>
  </soapenv:Body>
</soapenv:Envelope>'

По сообщениям, подобным this , мне кажется, что я мог бы сделать запрос, подобный следующему:

;with xmlnamespaces (N'http://schemas.xmlsoap.org/soap/envelope/' as ns0, 
                     N'urn:JobService' as ns2)
select @x.value('(/ns0:envelope/ns0:body/ns2:getJobActions/ns2:getJobActionsReturn/ns2:job/ns2:actualEndTime)[1]', 'nvarchar(max)')

Я пробовал различные перестановки пространства именпрефикс, но все, что я пытаюсь, возвращает ноль.Я даже не могу получить поддельное значение восходящего потока, которое возвращает ненулевое значение:

;with xmlnamespaces (N'http://schemas.xmlsoap.org/soap/envelope/' as ns0)
select @x.value('(/ns0:envelope/ns0:body/ns0:bogus)[1]', 'nvarchar(max)')

Я не получаю пространства имен (каждая веб-страница, объясняющая их, кажется длиной в милю).Извините, пожалуйста и спасибо.

1 Ответ

3 голосов
/ 11 июня 2019

Вы близки, но у вас были следующие ошибки:

  • Имена тегов чувствительны к регистру - вам нужно использовать <ns0:Envelope> (не <ns0:envelope>) и т. д.

  • Вы неправильно набрали <ns2:getJobActionsResponse> как <ns2:getJobActions>

  • Вы не прошли "весь путь" до<ns2:dateString> элемент

Попробуйте это:

declare @x 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>
    <bogus>1934</bogus>
    <getJobActionsResponse xmlns="urn:JobService">
      <getJobActionsReturn>
        <job xmlns:ns1="urn:JobService" xsi:type="ns1:SvcJob">
          <actions />
          <actualEndTime>
            <dateString>2019-05-15 19:46:54.207</dateString>
          </actualEndTime>
        </job>
      </getJobActionsReturn>
    </getJobActionsResponse>
  </soapenv:Body>
</soapenv:Envelope>'

;with xmlnamespaces (N'http://schemas.xmlsoap.org/soap/envelope/' as ns0, 
                     N'urn:JobService' as ns2)
select @x.value('(/ns0:Envelope/ns0:Body/ns2:getJobActionsResponse/ns2:getJobActionsReturn/ns2:job/ns2:actualEndTime/ns2:dateString)[1]', 'nvarchar(max)')
...