2016-05-19 51 views
1

我有這樣的XML標記一個元素的孫元素:如何選擇使用的XDocument和LINQ

<preferences> 
    <section name="PREF_SECTION_NAME_1"> 
    <preference name="PREF_EXAMPLE_1" type="text"> 
     <default value="false"></default> 
    </preference> 
    <preference name="PREF_EXAMPLE_2" type="radio"> 
     <default value="true"></default> 
    </preference> 
    <preference name="PREF_EXAMPLE_3" type="radio"> 
     <default value="false"></default> 
    </preference> 
    </section> 
    <section name="PREF_SECTION_NAME_2"> 
    <preference name="PREF_EXAMPLE_4" type="radio"> 
     <default value="true"></default> 
    </preference> 
    <preference name="PREF_EXAMPLE_5" type="radio"> 
     <default value="false"></default> 
    </preference> 
    <preference name="PREF_EXAMPLE_6" type="radio"> 
     <default value="true"></default> 
    </preference> 
    </section> 
</preferences> 

我想要得到當偏好屬性名=「PREF_EXAMPLE_2」默認值

我得到了這個:

var t = from p in xDocUser.Descendants("preference").Attributes("name").Where(d=>d.Value==preferencename) select p; 

它給了我偏好的屬性,但不是它的孩子。

我該如何做到這一點?

+0

嗯,它實際上只是給你的屬性,而不是元素。不清楚你想要實現什麼,或者你爲什麼要使用一個查詢表達式,這個查詢表達式只是「從某些東西中選擇p」而已。 –

+0

@JonSkeet嗨,喬恩,謝謝你的評論。我想從xDocument獲取Preference屬性名稱=「PREF_EXAMPLE_2」時的默認值。你是否建議不要使用linq? –

+0

我應該添加我將xml文檔加載到xDocument中。你是否也建議我應該堅持使用xml selectnodes等?謝謝 –

回答

2

嗯,是的,你要求的偏好屬性。這聽起來像你真正想要的東西,如:

var defaults = from pref in xDocUser.Descendants("preference") 
       where (string) pref.Attribute("name") == preferenceName 
       select (bool) pref.Element("default").Attribute("value"); 

這會給你的默認值的IEnumerable<bool>所有匹配的偏好。

+0

我的意圖是獲取滿足條件的Preference的子節點。我知道我的代碼錯了。我只是剛剛發現了xDocument,而我是linq的新手:)我更喜歡通過示例來學習,但很明顯,我在Google搜索中提到我的問題的方式是錯誤的。感謝我憐憫我! –

+0

@AndrewSimpson:如果你只是想要元素,那麼將select子句改爲'select pref.Element(「default」)'。 –

+0

謝謝你 –