2016-04-23 13 views
0

他の要素の値を使用して子孫要素の1つの値を取得しようとしています。ここで別の要素の値を使用してルート子孫要素を取得する

は、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> 

私がやろうとしているそれは何の要素は、以下のコードは、要素のすべての残りのために働くregional delivery

あるTOTAL_COSTノードの値を取得することです:

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")== "Single-hour Window"のような他のノードでも同じように動作します。 – user2574121

0

私はあなたのコードを試してみましたが、それは魅力的です。

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

var cost = doc.XPathSelectElement(deliveryTotalCost); 

Console.WriteLine(cost.Value); 

95.52

私は個人的にクエリはより複雑得るとき、それは特に、より読みやすいと思うプリントされます:あなたはまた、次のようにしたい要素を取得するためにXPathを使用することができます。 Linqは特にDALやList操作のために非常に強力ですが、XML解析のために私は大きなファンではありません。

幸運

+0

これは変です!私はなぜそれが私の最後に働いていないのか分かりません。テストのために、私はElement( "TOTAL_COST")== "95.52"へのルックアップを変更しました。それではElement( "SERVICE_TYPE")== "地域配送"のために働いていないだけです – user2574121

関連する問題