2013-07-17 297 views
0

我在使用XPath從XML中提取所需數據時遇到了一個問題。我連接到一個Web服務並獲得XML格式的響應。然後我使用XPath在XmlNode中加載數據。我爲這段代碼使用C#。我面臨的問題是我無法從XML響應中讀取與其關聯的任何節點和數據。 XmlNode中的值始終爲空。 我最好喜歡拉一個特定節點的數據。使用XPath獲取所需數據但獲取空值

下面是我在C#代碼中讀取響應和存儲節點值的過程。

String webURL3; 
WebRequest YRCRateQuote; 
WebResponse resp3; 
Stream respStream3; 
XmlDocument rateQuote3 = new XmlDocument(); 
XmlNode freightCharge3; 
XmlNode serviceDays3; 

//build web request 
webURL3 = String.Format(webstring); 

//create web request 
YRCRateQuote = WebRequest.Create(webURL3); 
//make web service call 
resp3 = YRCRateQuote.GetResponse(); 

//read response 
respStream3 = resp3.GetResponseStream(); 
rateQuote3.Load(respStream3); 

//use xpath to pull reqd data 
freightCharge3 = rateQuote3.SelectSingleNode("//TOTAL_COST"); 
serviceDays3 = rateQuote3.SelectSingleNode("//SERVICEDAYS"); 
//I also tried this 
freightCharge3 = rateQuote3.SelectSingleNode("//TOTAL_COST[DELIVERYTIME='Multi-hour Window']"); 

這是我從Web服務獲得的XML響應。

<?xml version="1.0"?> 
<RateQuoteResponse xmlns="http://ratequote.usfnet.usfc.com/v2/x1"> 
    <STATUS> 
    <CODE>0</CODE> 
    <VIEW>SECURED</VIEW> 
    <VERSION> 
     <CURRENT>V2X1</CURRENT> 
     <CURRENT_RELEASE_DATE>02/06/2010</CURRENT_RELEASE_DATE> 
     <LATEST>V2X1</LATEST><LATEST_RELEASE_DATE>02/06/2010</LATEST_RELEASE_DATE> 
    </VERSION></STATUS> 
    <RateQuote> 
    <ORIGIN> 
     <NAME>INDIANAPOLIS</NAME> 
     <CARRIER>USF Holland, Inc</CARRIER> 
     <ADDRESS>2530 S TIBBS AVE</ADDRESS> 
     <CITY>INDIANAPOLIS</CITY> 
     <STATE>IN</STATE> 
     <ZIP>46241</ZIP> 
     <PHONE>3172277627</PHONE> 
     <PHONE_TOLLFREE>8006274831</PHONE_TOLLFREE> 
     <FAX>3172277629</FAX> 
    </ORIGIN> 
    <DESTINATION> 
     <NAME>INDIANAPOLIS</NAME> 
     <CARRIER>USF Holland, Inc</CARRIER> 
     <ADDRESS>2530 S TIBBS AVE</ADDRESS> 
     <CITY>INDIANAPOLIS</CITY> 
     <STATE>IN</STATE> 
     <ZIP>46241</ZIP> 
     <PHONE>3172277627</PHONE> 
     <PHONE_TOLLFREE>8006274831</PHONE_TOLLFREE> 
     <FAX>3172277629</FAX> 
    </DESTINATION> 
    <ORIGIN_ZIP>46202</ORIGIN_ZIP> 
    <DESTINATION_ZIP>46204</DESTINATION_ZIP> 
    <TOTAL_COST>117.02</TOTAL_COST> 
    <DISCOUNTPERCENTAGE>85.0</DISCOUNTPERCENTAGE> 
    <DISCOUNTAMOUNT>512.04</DISCOUNTAMOUNT> 
    <SERVICEDAYS>1</SERVICEDAYS> 
    <INDUSTRYDAYS>1.5</INDUSTRYDAYS> 
    <CLASSWEIGHT> 
     <CLASS>60</CLASS> 
     <ASCLASS>60</ASCLASS> 
     <WEIGHT>1500</WEIGHT> 
     <CHARGES>602.4</CHARGES> 
    </CLASSWEIGHT> 
    <ADDIONALCHARGES> 
     <RATE>Fuel Surcharge</RATE> 
     <CHARGES>26.66</CHARGES> 
     <DESCRIPTION>FSC29.50% ON DIESEL OF 386.7</DESCRIPTION> 
    </ADDIONALCHARGES> 
    <SERVICEUPGRADES> 
     <DELIVERYDAYS>Please Call Customer Service for Available Days and Times</DELIVERYDAYS> 
     <DELIVERYTIME>Single-hour Window</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed window</SERVICE_TYPE> 
     <TOTAL_COST>267.02</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDAYS>Please Call Customer Service for Available Days and Times</DELIVERYDAYS> 
     <DELIVERYTIME>Multi-hour Window</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed window</SERVICE_TYPE> 
     <TOTAL_COST>267.02</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDAYS>Please Call Customer Service for Available Days and Times</DELIVERYDAYS> 
     <DELIVERYTIME>Single or Multi Day Window</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed window</SERVICE_TYPE> 
     <TOTAL_COST>152.02</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDATE>07/17/2013</DELIVERYDATE> 
     <DELIVERYDAYS>1</DELIVERYDAYS> 
     <DELIVERYTIME>before 9:00 AM</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed delivery</SERVICE_TYPE> 
     <TOTAL_COST>217.02</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDATE>07/17/2013</DELIVERYDATE> 
     <DELIVERYDAYS>1</DELIVERYDAYS> 
     <DELIVERYTIME>before 12:00 PM (noon)</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed delivery</SERVICE_TYPE> 
     <TOTAL_COST>182.02</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDATE>07/17/2013</DELIVERYDATE> 
     <DELIVERYDAYS>1</DELIVERYDAYS> 
     <DELIVERYTIME>before 3:30 PM</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed delivery</SERVICE_TYPE> 
     <TOTAL_COST>152.02</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDATE>07/17/2013</DELIVERYDATE> 
     <DELIVERYDAYS>1</DELIVERYDAYS> 
     <SERVICE_TYPE>regional delivery</SERVICE_TYPE> 
     <TOTAL_COST>117.02</TOTAL_COST> 
    </SERVICEUPGRADES> 
    </RateQuote> 
</RateQuoteResponse> 

回答

1

你需要考慮到的命名空間

見:http://msdn.microsoft.com/en-us/library/h0hw012b.aspx

XmlNamespaceManager nsmgr = new XmlNamespaceManager(rateQuote3); 
    nsmgr.AddNamespace("rq", "http://ratequote.usfnet.usfc.com/v2/x1"); 
    XmlNode cost = rateQuote3.SelectSingleNode("//rq:TOTAL_COST", nsmgr); 
+0

謝謝!這工作..我曾嘗試使用命名空間,但我的語法不正確。我有一次問題,但。如何搜索特定的節點?例如。如果我想爲DELIVERYTIME ='多小時窗口'獲得Total_COST。我試圖做這個和其他一些事情,但它沒有奏效。 freightCharge3 = rateQuote3.SelectSingleNode(「// rq:TOTAL_COST [DELIVERYTIME ='Multi-hour Window']」,nsmgr); – user2574121

+0

我想通了。我需要做的是這個,freightCharge3 = rateQuote3.SelectSingleNode(「// rq:SERVICEUPGRADES [1] // rq:TOTAL_COST」,nsmgr); – user2574121