C# 如何使用xDocument和Linq选择元素的孙子元素
我有以下XML标记:C# 如何使用xDocument和Linq选择元素的孙子元素,c#,linq,linq-to-xml,C#,Linq,Linq To Xml,我有以下XML标记: <preferences> <section name="PREF_SECTION_NAME_1"> <preference name="PREF_EXAMPLE_1" type="text"> <default value="false"></default> </preference> <preference name="PREF_EXAMPLE_2"
<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>
这为我提供了首选项的属性,但不是它的子项
我怎样才能做到这一点呢?是的,您是在询问偏好的属性。听起来你真的想要这样的东西:
var defaults = from pref in xDocUser.Descendants("preference")
where (string) pref.Attribute("name") == preferenceName
select (bool) pref.Element("default").Attribute("value");
这将为您提供所有匹配首选项的默认值的
IEnumerable
。实际上它只提供属性,而不是元素。现在还不清楚您想要实现什么,或者为什么要使用一个查询表达式,它只是p中的(一些东西)选择p
@JonSkeet Hi Jon,谢谢您的评论。我想从xDocument获取首选项属性name=“PREF_EXAMPLE_2”的默认值。您是否建议不要使用linq?我应该补充一点,我正在将xml文档加载到xDocument中。您是否也建议我只使用xml selectnodes等?谢谢,我不是建议您不要使用LINQ,而是建议您不要使用无意义的查询表达式。要么使用有意义的查询表达式(例如使用where
子句),要么只使用基于lambda的方式。我的目的是获取满足条件的首选子节点。我知道我的密码错了。我刚刚发现了xDocument,我是linq的新手:)我更喜欢通过示例学习,但显然我在谷歌搜索中用词提问的方式是错误的。谢谢你怜悯我@AndrewSimpson:如果只需要元素,那么将select子句更改为select pref.element(“默认”)
。
var defaults = from pref in xDocUser.Descendants("preference")
where (string) pref.Attribute("name") == preferenceName
select (bool) pref.Element("default").Attribute("value");