Вложенный вывод XML - PullRequest
       1

Вложенный вывод XML

0 голосов
/ 06 сентября 2018

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

Код, который я пытаюсь запустить, таков:

DECLARE @XmlIN XML
SELECT @xmlin  = '
<ShippingScheduleResponse   xmlns="rrn:org.xcbl:schemas/xcbl/v4_0/materialsmanagement/v1_0/materialsmanagement.xsd">
  <ShippingScheduleResponseHeader>
    <ShippingScheduleHeader>
        <ScheduleReferences>
        <OtherScheduleReferences>
          <ReferenceCoded xmlns="rrn:org.xcbl:schemas/xcbl/v4_0/core/core.xsd">
            <ReferenceTypeCoded>Other</ReferenceTypeCoded>
            <ReferenceTypeCodedOther>HomeOwnerOccupied</ReferenceTypeCodedOther>
            <ReferenceDescription>N</ReferenceDescription>
          </ReferenceCoded>
          <ReferenceCoded xmlns="rrn:org.xcbl:schemas/xcbl/v4_0/core/core.xsd">
            <ReferenceTypeCoded>Other</ReferenceTypeCoded>
            <ReferenceTypeCodedOther>WorkOrderNumber</ReferenceTypeCodedOther>
            <ReferenceDescription>7456634</ReferenceDescription>
          </ReferenceCoded>
          <ReferenceCoded xmlns="rrn:org.xcbl:schemas/xcbl/v4_0/core/core.xsd">
            <ReferenceTypeCoded>Other</ReferenceTypeCoded>
            <ReferenceTypeCodedOther>SSID</ReferenceTypeCodedOther>
            <ReferenceDescription>293283</ReferenceDescription>
          </ReferenceCoded>
        </OtherScheduleReferences>
      </ScheduleReferences>
    </ShippingScheduleHeader>
  </ShippingScheduleResponseHeader>
</ShippingScheduleResponse>
'

SELECT

    RefLineValue = ref.value('@xmlns', 'varchar(300)'),
    RefTypeOther = ref.value('(ReferenceTypeCodedOther)[1]', 'varchar(50)'),
    RefDescription = ref.value('(ReferenceDescription)[1]', 'varchar(50)')
FROM
    @XmlIN.nodes('/ShippingScheduleResponse/ShippingScheduleResponseHeader/ShippingScheduleHeader/ScheduleReferences') AS XTbl(schref)
CROSS APPLY
    schref.nodes('OtherScheduleReferences/ReferenceCoded') AS XTbl2(ref)

Я пытаюсь получить значения для referenceTypeCodedOther и ReferenceDescription в таблице.

Наилучшим сценарием было бы получить Справочное описание для ReferenceTypeCodedOther, равного SSID, без необходимости вводить в жестком коде st.value('(//*:ReferenceCoded[7][1]//*:ReferenceDescription)[1]', 'char(200)')

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

1 Ответ

0 голосов
/ 11 сентября 2018

Ваш код почти идеален: чтобы извлечь значения из вашего xml, вам просто нужно обработать пространства имен, используя ключевое слово WITH:

;WITH XMLNAMESPACES (
    'rrn:org.xcbl:schemas/xcbl/v4_0/materialsmanagement/v1_0/materialsmanagement.xsd' as ns1,
    'rrn:org.xcbl:schemas/xcbl/v4_0/core/core.xsd' as ns2)
SELECT
  RefTypeOther = ref.value('(ns2:ReferenceTypeCoded)[1]', 'varchar(50)'),
  RefTypeOther = ref.value('(ns2:ReferenceTypeCodedOther)[1]', 'varchar(50)'),
  RefDescription = ref.value('(ns2:ReferenceDescription)[1]', 'varchar(50)')
FROM
    @XmlIN.nodes('/ns1:ShippingScheduleResponse/ns1:ShippingScheduleResponseHeader/ns1:ShippingScheduleHeader/ns1:ScheduleReferences') AS XTbl(schref)
CROSS APPLY
    schref.nodes('ns1:OtherScheduleReferences/ns2:ReferenceCoded') AS XTbl2(ref)

Результаты:

enter image description here

Теперь вы можете фильтровать по RefDescription = 'SSID'

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