2013-07-17 290 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