Итерация по узлу XML с SQL Server, который имеет пространства имен - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь извлечь вложенный XML с помощью SQL (я бы предпочел использовать Python, но должен использовать SQL)

Вот пример XML с кодом теста SQL

testdb:

select cast('
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns23:FundsDeposit xmlns:ns23="www.testbank.com/IntegrationServices/V6.0.0.1/API/Partner/KBMac/KBMac" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:ns10="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.ManagedFund" xmlns:ns11="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.testSaver" xmlns:ns12="http://schemas.datacontract.org/2004/07/CertegyServiceAgent" xmlns:ns13="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.PinAtBranch" xmlns:ns14="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.Customers.AML" xmlns:ns15="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.OnBoarding" xmlns:ns16="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.PrePaidCards" xmlns:ns17="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.Customers.ForeignTax" xmlns:ns18="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.Customers.ReferenceData" xmlns:ns19="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.WorkItem" xmlns:ns2="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts" xmlns:ns20="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.DirectServices" xmlns:ns21="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.ReferenceData.Party.PartyDataManagement" xmlns:ns22="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.DebitCards" xmlns:ns24="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.Insurance" xmlns:ns25="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.Customers" xmlns:ns26="http://schemas.datacontract.org/2004/07/KIDEntities" xmlns:ns27="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:ns28="http://schemas.datacontract.org/2004/07/testbank.ManagedServices.Common.Entities.ForeignTax" xmlns:ns3="urn:testbank.ManagedServices" xmlns:ns4="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.Customers.IdentificationDocuments" xmlns:ns5="http://schemas.datacontract.org/2004/07/KISInterfaces" xmlns:ns6="http://schemas.datacontract.org/2004/07/testbank.ManagedServices.Common.Entities" xmlns:ns7="http://schemas.datacontract.org/2004/07/testBank.BusinessMessaging.CreditCardsWS" xmlns:ns8="http://schemas.datacontract.org/2004/07/testbank.ManagedServices.Common.Adapters.Components.UnsecuredLending" xmlns:ns9="http://schemas.datacontract.org/2004/07/CBIServices.DataContracts.GELoans">
      <ns23:request>
        <ns2:Cheques>
          <ns6:Cheque>
            <ns6:CHEQUEACCOUNT>0011411</ns6:CHEQUEACCOUNT>
            <ns6:CHEQUEACCOUNTTYPE>000</ns6:CHEQUEACCOUNTTYPE>
            <ns6:CHEQUEAMOUNT>10.0</ns6:CHEQUEAMOUNT>
            <ns6:CHEQUEBANK>01</ns6:CHEQUEBANK>
            <ns6:CHEQUEBRANCH>1010</ns6:CHEQUEBRANCH>
            <ns6:CHEQUENUMBER>0101</ns6:CHEQUENUMBER>
          </ns6:Cheque>
          <ns6:Cheque>
            <ns6:CHEQUEACCOUNT>00113111</ns6:CHEQUEACCOUNT>
            <ns6:CHEQUEACCOUNTTYPE>000</ns6:CHEQUEACCOUNTTYPE>
            <ns6:CHEQUEAMOUNT>30.0</ns6:CHEQUEAMOUNT>
            <ns6:CHEQUEBANK>02</ns6:CHEQUEBANK>
            <ns6:CHEQUEBRANCH>1010</ns6:CHEQUEBRANCH>
            <ns6:CHEQUENUMBER>0101</ns6:CHEQUENUMBER>
          </ns6:Cheque>
          <ns6:Cheque>
            <ns6:CHEQUEACCOUNT>0011211</ns6:CHEQUEACCOUNT>
            <ns6:CHEQUEACCOUNTTYPE>000</ns6:CHEQUEACCOUNTTYPE>
            <ns6:CHEQUEAMOUNT>20.0</ns6:CHEQUEAMOUNT>
            <ns6:CHEQUEBANK>03</ns6:CHEQUEBANK>
            <ns6:CHEQUEBRANCH>1010</ns6:CHEQUEBRANCH>
            <ns6:CHEQUENUMBER>0101</ns6:CHEQUENUMBER>
          </ns6:Cheque>
        </ns2:Cheques>
      </ns23:request>
    </ns23:FundsDeposit>
  </S:Body>
</S:Envelope>
' as xml) as SoapInput_CAST into #xml

Выберите код:

SELECT
      b.improv.value('.','nvarchar(255)') test
FROM #xml a
CROSS APPLY a.SoapInput_CAST.nodes('//*[local-name()="CHEQUEBANK"]/text()') b(improv)

Текущий вывод:

test
01
02
03

Сейчас я могу получить только один столбец, используя этот запрос, когда использую локальное имя CHEQUEBANKи с помощью Cross Apply.Как получить другие столбцы из узла xml ns6: Проверить?т.е. CHEQUEACCOUNT, CHEQUEACCOUNTTYPE и т. д.

Я новичок в работе с XML с использованием SQL

1 Ответ

0 голосов
/ 10 октября 2018

Я не уверен, что это именно то, что вам нужно, но похоже, что вы просто хотите, чтобы все элементы для каждого узла Cheque возвращались в виде столбцов?

Я бы просто установил путьв a.SoapInput_CAST.nodes() указан явный путь к родительскому элементу, который вы хотите (т.е. S:Envelope/S:Body/ns23:FundRequest/ns23:request/ns2:Cheques/ns6:Cheque).Оттуда вы можете явно извлекать дочерние элементы один за другим в предложении select, используя b.improv.values().

. Я удалил некоторые пространства имен, потому что, честно говоря, мне не хотелось вводить их все. Но вотупрощенный пример того, что я имею в виду.

if object_id('tempdb.dbo.#xml') is not null drop table #xml
select cast('

    <FundsDeposit xmlns:ns6="http://schemas.datacontract.org/2004/07/testbank.ManagedServices.Common.Entities">
      <request>
        <Cheques>
          <ns6:Cheque>
            <ns6:CHEQUEACCOUNT>0011411</ns6:CHEQUEACCOUNT>
            <ns6:CHEQUEACCOUNTTYPE>000</ns6:CHEQUEACCOUNTTYPE>
            <ns6:CHEQUEAMOUNT>10.0</ns6:CHEQUEAMOUNT>
            <ns6:CHEQUEBANK>01</ns6:CHEQUEBANK>
            <ns6:CHEQUEBRANCH>1010</ns6:CHEQUEBRANCH>
            <ns6:CHEQUENUMBER>0101</ns6:CHEQUENUMBER>
          </ns6:Cheque>
          <ns6:Cheque>
            <ns6:CHEQUEACCOUNT>00113111</ns6:CHEQUEACCOUNT>
            <ns6:CHEQUEACCOUNTTYPE>000</ns6:CHEQUEACCOUNTTYPE>
            <ns6:CHEQUEAMOUNT>30.0</ns6:CHEQUEAMOUNT>
            <ns6:CHEQUEBANK>02</ns6:CHEQUEBANK>
            <ns6:CHEQUEBRANCH>1010</ns6:CHEQUEBRANCH>
            <ns6:CHEQUENUMBER>0101</ns6:CHEQUENUMBER>
          </ns6:Cheque>
          <ns6:Cheque>
            <ns6:CHEQUEACCOUNT>0011211</ns6:CHEQUEACCOUNT>
            <ns6:CHEQUEACCOUNTTYPE>000</ns6:CHEQUEACCOUNTTYPE>
            <ns6:CHEQUEAMOUNT>20.0</ns6:CHEQUEAMOUNT>
            <ns6:CHEQUEBANK>03</ns6:CHEQUEBANK>
            <ns6:CHEQUEBRANCH>1010</ns6:CHEQUEBRANCH>
            <ns6:CHEQUENUMBER>0101</ns6:CHEQUENUMBER>
          </ns6:Cheque>
        </Cheques>
      </request>
    </FundsDeposit>'
 as xml) as SoapInput_CAST into #xml

    ;with XMLNAMESPACES ( 'http://schemas.datacontract.org/2004/07/testbank.ManagedServices.Common.Entities' as ns6 )
select
      b.improv.value('ns6:CHEQUEACCOUNT[1]', 'nvarchar(max)'),
      b.improv.value('ns6:CHEQUEBANK[1]', 'nvarchar(max)')
from #xml a
cross apply a.SoapInput_CAST.nodes('FundsDeposit/request/Cheques/ns6:Cheque') b(improv)

Надеюсь, это поможет.

EDIT Я думаю, что часть, за которой вы, вероятно, были в основном после, была списком выбора.Вы также можете по существу использовать путь, который вы уже используете в функции nodes(), но вы хотите охватить его до родительского узла (то есть Cheque), а не CHEQUEBANK

...