2017-07-27 21 views
1

要素/属性の値がXMLのどこに存在するかに関係なく、その値を検索しようとしています。XMLの任意の場所で要素または属性の値を検索

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<cXML payloadID="12345677-12345567" timestamp="2017-07-26T09:11:05"> 
    <Header> 
    <From> 
     <Credential domain="1212"> 
     <Identity></Identity> 
     <SharedSecret/> 
     </Credential> 
    </From> 
    <To> 
     <Credential domain="1212"> 
     <Identity></Identity> 
     </Credential> 
    </To> 
    <Sender> 
     <UserAgent/> 
     <Credential domain="8989"> 
     <Identity>10678</Identity> 
     <SharedSecret>Testing123</SharedSecret> 
     </Credential> 
    </Sender> 
    </Header> 
    <Request deploymentMode="Prod"> 
    <ConfirmationRequest> 
     <ConfirmationHeader noticeDate="2017-07-26T09:11:05" operation="update" type="detail"> 
     <Total> 
      <Money>0.00</Money> 
     </Total> 
     <Shipping> 
      <Description>Delivery</Description> 
     </Shipping> 

     <Comments>WO# generated</Comments> 
     </ConfirmationHeader> 
     <OrderReference orderDate="2017-07-25T15:22:11" orderID="123456780000"> 
     <DocumentReference payloadID="5678-4567"/> 
     </OrderReference> 
     <ConfirmationItem quantity="1" lineNumber="1"> 
     <ConfirmationStatus quantity="1" type="detail"> 
      <ItemIn quantity="1"> 
      <ItemID> 
       <SupplierPartID>R954-89</SupplierPartID> 
      </ItemID> 
      <ItemDetail> 
       <UnitPrice> 
       <Money currency="USD">0.00</Money> 
       </UnitPrice> 
       <Description>Test Descritpion 1</Description> 
       <UnitOfMeasure>QT</UnitOfMeasure> 
      </ItemDetail> 
      </ItemIn> 
     </ConfirmationStatus> 
     </ConfirmationItem> 
     <ConfirmationItem quantity="1" lineNumber="2"> 
     <ConfirmationStatus quantity="1" type="detail"> 
      <ItemIn quantity="1"> 
      <ItemID> 
       <SupplierPartID>Y954-89</SupplierPartID> 
      </ItemID> 
      <ItemDetail> 
       <UnitPrice> 
       <Money currency="USD">0.00</Money> 
       </UnitPrice> 
       <Description>Test Descritpion 2</Description> 
       <UnitOfMeasure>QT</UnitOfMeasure> 
      </ItemDetail> 
      </ItemIn> 
     </ConfirmationStatus> 
     </ConfirmationItem> 

    </ConfirmationRequest> 
    </Request> 
</cXML> 

私はDocumentReference要素にpayloadIDの値を取得したいです。

BEGIN 
    Declare @Xml xml 
    Set @Xml = ('..The XML From Above..' as xml)  
END 

--no value comes back 
Select c.value('(/*/DocumentReference/@payloadID)[0]','nvarchar(max)') from @Xml.nodes('//cXML') x(c) 

--no value comes back 
Select c.value('@payloadID','nvarchar(max)') from @Xml.nodes('/cXML/*/DocumentReference') x(c) 

--check if element exists and it does 
Select @Xml.exist('//DocumentReference'); 

を私は、XPathエディタでこれを試してみました://DocumentReference/@payloadID これは、作業を行いますが、私は同等の構文は.nodes()(などを呼び出すSQL

+4

'セレクトc.value( '@ payloadID'、 'NVARCHAR(MAX)')@ Xml.nodes( '// DocumentReference')からのx ...働くことができません(c) '? – Siyual

+0

@Siyual、ああ男!同様の例は、常にルート要素への参照を持っていたので、私はそれが必要だと思った。私はそれを試みたこともありません。答えとして投稿したい場合は、それは素晴らしいでしょう。 – DDiVita

答えて

1

にあるのかわからないよこれは私がこれまで試してみましたものです

SELECT @XML.value('(//DocumentReference/@payloadID)[1]','nvarchar(max)') 

A:に、不要なオーバーヘッドである...

よりよいこのようにそれを試してみてください)コメントで提案されています注意してください、XPath1で数え始めます。 [0]とあなたの例では、

--no value comes back 
Select c.value('(/*/DocumentReference/@payloadID)[0]','nvarchar(max)') from... 
関連する問題