2016-04-23 272 views
0

我想要使用另一個元素的值獲取其中一個後代元素的值。使用另一個元素的值獲取根後代元素

這裏的XML的外觀:

<RateQuoteResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <RateQuote> 
    <SERVICEUPGRADES> 
     <DELIVERYTIME>Single-hour Window</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed window</SERVICE_TYPE> 
     <TOTAL_COST>245.52</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYTIME>Multi-hour Window</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed window</SERVICE_TYPE> 
     <TOTAL_COST>245.52</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>130.52</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDATE>04/26/2016</DELIVERYDATE> 
     <DELIVERYDAYS>1</DELIVERYDAYS> 
     <DELIVERYTIME>before 9:00 AM</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed delivery</SERVICE_TYPE> 
     <TOTAL_COST>195.52</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDATE>04/26/2016</DELIVERYDATE> 
     <DELIVERYDAYS>1</DELIVERYDAYS> 
     <DELIVERYTIME>before 12:00 PM (noon)</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed delivery</SERVICE_TYPE> 
     <TOTAL_COST>160.52</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDATE>04/26/2016</DELIVERYDATE> 
     <DELIVERYDAYS>1</DELIVERYDAYS> 
     <DELIVERYTIME>before 3:30 PM</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed delivery</SERVICE_TYPE> 
     <TOTAL_COST>130.52</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDATE>04/26/2016</DELIVERYDATE> 
     <DELIVERYDAYS>1</DELIVERYDAYS> 
     <SERVICE_TYPE>regional delivery</SERVICE_TYPE> 
     <TOTAL_COST>95.52</TOTAL_COST> 
    </SERVICEUPGRADES> 
    </RateQuote> 
</RateQuoteResponse> 

我想要做的是它獲得價值TOTAL_COST節點,在元素regional delivery

下面的代碼適用於所有元素的其餘部分:

var deliveryTime1 = doc.Root.Descendants("SERVICEUPGRADES").SingleOrDefault(c => (string)c.Element("DELIVERYTIME") == "Single-hour Window"); 

var deliveryTime2 = doc.Root.Descendants("SERVICEUPGRADES").SingleOrDefault(c => (string)c.Element("DELIVERYTIME") == "Multi-hour Window"); 

var deliveryTime3 = doc.Root.Descendants("SERVICEUPGRADES").SingleOrDefault(c => (string)c.Element("DELIVERYTIME") == "Single or Multi Day Window"); 

所有這些工作,但即使節點存在並且包含具有值的元素,每次都返回null。

var deliveryTime7 = doc.Root.Descendants("SERVICEUPGRADES").SingleOrDefault(c => (string)c.Element("SERVICE_TYPE") == "regional delivery"); 

我試圖找到這個特定的元素時做錯了什麼?我嘗試添加命名空間(類似下面的東西),但也沒有工作。

var deliveryTime7 = doc.Root.Descendants(ns + "SERVICEUPGRADES").SingleOrDefault(e => (string)e.Element(ns + "SERVICE_TYPE") == "regional delivery"); 
+0

我試過你的代碼,它適用於我。 – Arijoon

+0

@ user2574121測試你的代碼也可以:https://dotnetfiddle.net/Wv0vM6。如果您可以在dotnetfiddle中重現問題,則有機會進一步幫助... – har07

回答

0

因爲您的內容不在命名空間中(就我們所見),添加命名空間並不是必需的。但你有什麼應該工作。

我可以給你的唯一建議是在使用SingleOrDefault()時要小心,如果有多個結果,它會拋出,這取決於你查詢的服務類型,可能會發生。

var query = 
    from e in doc.Descendants("SERVICEUPGRADES") 
    where (string)e.Element("SERVICE_TYPE") == "regional delivery" 
    select (decimal)e.Element("TOTAL_COST"); 
+0

謝謝。我會記下這一點。上述查詢沒有產生任何結果。對我來說,似乎條件(「SERVICE_TYPE」)==「區域交付」不工作不知道爲什麼。對於像其他節點(「DELIVERYTIME」)==「單小時窗口」)相同的作品 – user2574121

0

我試過你的代碼,它的作用就像一個魅力。你也可以使用XPath來得到你想要如下元素:它將打印95.52

我個人認爲這是更具可讀性,特別是當查詢變得越來越複雜

string deliveryTotalCost = "//SERVICEUPGRADES[SERVICE_TYPE='regional delivery']/TOTAL_COST"; 

var cost = doc.XPathSelectElement(deliveryTotalCost); 

Console.WriteLine(cost.Value); 

。 Linq對於DAL和List操作非常強大,但對於XML解析,我不是一個很大的粉絲。

祝你好運

+0

這很奇怪!我不知道爲什麼這不是我的目的。爲了測試,我將查找改爲Element(「TOTAL_COST」)==「95.52」,現在它找到了正確的元素。所以它不適用於Element(「SERVICE_TYPE」)==「區域交付」 – user2574121

相關問題