Étant donné le code XML suivant dans SQL Server, comment puis-je get une valeur?

Voici mon SQL. Je n'arrive pas à get une seule valeur de cette chose. Cela ne fonctionne que si je supprime tous les attributes xmlns.

Je pense que le problème est que ce file xml contient 2 namespaces par défaut, un attaché à l'élément Response et un attaché à l'élément Shipment.

DECLARE @xml XML SET @xml = '<TrackResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Response xmlns="http://www.ups.com/XMLSchema/XOLTWS/Common/v1.0"> <ResponseStatus> <Code>1</Code> <Description>Success</Description> </ResponseStatus> <TransactionReference /> </Response> <Shipment xmlns="http://www.ups.com/XMLSchema/XOLTWS/Track/v2.0"> <InquiryNumber> <Code>01</Code> <Description>ShipmentIdentificationNumber</Description> <Value>1ZA50209234098230</Value> </InquiryNumber> <ShipperNumber>A332098</ShipperNumber> <ShipmentAddress> <Type> <Code>01</Code> <Description>Shipper Address</Description> </Type> <Address> <AddressLine>123 HWY X</AddressLine> <City>SOMETOWN</City> <StateProvinceCode>SW</StateProvinceCode> <PostalCode>20291 1234</PostalCode> <CountryCode>US</CountryCode> </Address> </ShipmentAddress> <ShipmentWeight> <UnitOfMeasurement> <Code>LBS</Code> </UnitOfMeasurement> <Weight>0.00</Weight> </ShipmentWeight> <Service> <Code>42</Code> <Description>UPS GROUND</Description> </Service> <Package> <TrackingNumber>1ZA50209234098230</TrackingNumber> <PackageServiceOption> <Type> <Code>01</Code> <Description>Signature Required</Description> </Type> </PackageServiceOption> <Activity> <ActivityLocation> <Address> <City>SOMEWHERE</City> <StateProvinceCode>PA</StateProvinceCode> <CountryCode>US</CountryCode> </Address> </ActivityLocation> <Status> <Type>X</Type> <Description>Damage reported. / Damage claim under investigation.</Description> <Code>UY</Code> </Status> <Date>20120424</Date> <Time>125000</Time> </Activity> <Activity> <ActivityLocation> <Address> <City>SOMEWHERE</City> <StateProvinceCode>PA</StateProvinceCode> <CountryCode>US</CountryCode> </Address> </ActivityLocation> <Status> <Type>X</Type> <Description>All merchandise discarded. UPS will notify the sender with details of the damage.</Description> <Code>GY</Code> </Status> <Date>20120423</Date> <Time>115500</Time> </Activity> <PackageWeight> <UnitOfMeasurement> <Code>LBS</Code> </UnitOfMeasurement> <Weight>0.00</Weight> </PackageWeight> </Package> </Shipment> </TrackResponse>' select Svc.Dsc.value('(/TrackResponse/Shipment/Service/Description)[1]', 'varchar(25)') from @xml.nodes('/TrackResponse') as Svc(Dsc) 

Deux problèmes:

  • vous ignorez de manière flagrante l'espace de noms XML défini sur l'élément <shipment>
  • votre expression XQuery était un peu éteinte

Essaye ça:

 -- define XML namespace ;WITH XMLNAMESPACES('http://www.ups.com/XMLSchema/XOLTWS/Track/v2.0' AS ns) select Svc.Dsc.value('(ns:Shipment/ns:Service/ns:Description)[1]', 'varchar(25)') from -- this already selects all <TrackResponse> nodes - no need to repeat that in -- your above call to .value() @xml.nodes('/TrackResponse') as Svc(Dsc) 

Me donne un résultat de:

 UPS GROUND 

Comme l'a dit @marc_s, vous ignorez les namespaces XML. Voici un exemple de violon sql . Cela donne X , je pense que c'est ce dont vous avez besoin. Lisez cet article pour en savoir plus . Note: *:TrackResponse[1]/*: dans le xpath

 --Results: X declare @xmlTable as table ( xmlData xml ) insert into @xmlTable select '<TrackResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Response xmlns="http://www.ups.com/XMLSchema/XOLTWS/Common/v1.0"> ... </TrackResponse>' ;with xmlnamespaces(default 'http://www.ups.com/XMLSchema/XOLTWS/Track/v2.0') select x.xmlData.value('(/*:TrackResponse[1]/*:Shipment[1]/Package[1]/Activity[1]/Status[1]/Type[1])','varchar(100)') as all_snacks from @xmlTable x