2016-04-30 3 views
2

xmlファイルからChargeTypeの値を取得するtsqlを使用します。 私はスクリプトを書いていましたが、両方のxmlレコードの値 'Principal'を常に返します。 何が間違っていて問題を解決する方法がわかりませんか?スクリプトは、値を返す必要があります。TSQL XML値は、すべてのレコードのノードの最初の値を返します

ChargeType 
Principal 
Taxed 

現在の結果

ChargeType 
Principal 
Principal 

ソースコード

DECLARE @xml XML = '<ListFinancialEventsResponse xmlns="http://www.test.com"> 
    <ListFinancialEventsResult> 
     <FinancialEvents> 
      <ShipmentEventList> 
       <ShipmentEvent> 
        <ShipmentItemList> 
         <ShipmentItem> 
          <ItemChargeList> 
           <ChargeComponent> 
            <ChargeType>Principal</ChargeType> 
            <ChargeAmount> 
             <CurrencyAmount>20.4</CurrencyAmount> 
             <CurrencyCode>RUR</CurrencyCode> 
            </ChargeAmount> 
           </ChargeComponent> 
           <ChargeComponent> 
            <ChargeType>Taxed</ChargeType> 
            <ChargeAmount> 
             <CurrencyAmount>1.23</CurrencyAmount> 
             <CurrencyCode>GEL</CurrencyCode> 
            </ChargeAmount> 
           </ChargeComponent> 
          </ItemChargeList> 
         </ShipmentItem> 
        </ShipmentItemList> 
       </ShipmentEvent> 
      </ShipmentEventList> 
     </FinancialEvents> 
    </ListFinancialEventsResult> 
</ListFinancialEventsResponse>'; 


;WITH XMLNAMESPACES('http://www.test.com' as ns) 
select 
     lfer.c.value('(//ns:ChargeType)[1]', 'nvarchar(50)') AS ChargeType 
from @xml.nodes('//ns:ListFinancialEventsResponse//ns:ListFinancialEventsResult//ns:ShipmentItemList//ns:ShipmentItem//ns:ItemChargeList//ns:ChargeComponent') lfer(c) 

答えて

4

まあ、いずれかあなたの中<ChargeType>上のノードのリスト全体を指定する必要がありますXPath、を使用ダッシュ(今、あなたはいくつかを残している)

@xml.nodes('/ns:ListFinancialEventsResponse/ns:ListFinancialEventsResult/ns:FinancialEvents/ns:ShipmentEventList ....... 

か、あなただけの<ChargeComponent>ノードを取得し、それらから<ChargeType>をつかむために、このXPathを使用する必要があります。

は、このT-SQLを試してみてください:ここ

;WITH XMLNAMESPACES('http://www.test.com' as ns) 
SELECT 
    -- do *NOT* use double dashes here! 
    lfer.c.value('(ns:ChargeType)[1]', 'nvarchar(50)') AS ChargeType 
FROM 
    -- just grab *all* <ChargeComponent> nodes anywhere in the XML 
    @xml.nodes('//ns:ChargeComponent') lfer(c) 

あなたの既存のコード:

lfer.c.value('(//ns:ChargeType)[1]' 

は意味:(なぜなら大手//の)私にすべて<ChargeType>ノードをを与え、次に取ります最初のノードはです。そのため、Principalというノードを2回取得しています。

関連する問題