Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
给定SQL Server中的以下XML,如何获取值?_Sql_Sql Server_Xml_Xml Namespaces - Fatal编程技术网

给定SQL Server中的以下XML,如何获取值?

给定SQL Server中的以下XML,如何获取值?,sql,sql-server,xml,xml-namespaces,Sql,Sql Server,Xml,Xml Namespaces,这是我的SQL。我似乎无法从这件事中得到任何价值。只有删除所有xmlns属性,它才能工作 我认为问题在于这个xml包含两个默认名称空间,一个附加到响应元素,另一个附加到装运元素 DECLARE @xml XML SET @xml = '<TrackResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Respo

这是我的SQL。我似乎无法从这件事中得到任何价值。只有删除所有xmlns属性,它才能工作

我认为问题在于这个xml包含两个默认名称空间,一个附加到响应元素,另一个附加到装运元素

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)
两个问题:

您显然忽略了在元素上定义的XML名称空间 您的XQuery表达式有点不正确 试试这个:

-- 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)

正如@marc_所说,您忽略了xml名称空间。这就是X,我想这就是你需要的。注意:*:TrackResponse[1]/*:在xpath中


您试图获取哪些元素的具体值?我想要/TrackResponse/shipping/Service/description的文本在本例中我确实需要最后一个活动元素的状态类型text/TrackResponse/shipping/Package/Activity[2]/status/type,但我只想了解如何正确指定名称空间。
UPS GROUND
--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