使用Linq选择具有特定属性的节点

时间:2014-09-02 21:15:13

标签: c# xml linq

我希望我的Linq语句只能在以下示例中使用 name =“Required”获取自定义字段

   <root>
    <appinfo>
        <application app_id=1234 app_name="SomeName">
        <customfield name="Required" value="123" />
        <customfield name="Not Required" value="234" />
        <customfield name="Not Required" value="345" />
        <customfield name="Not Required" value="456" />
        <customfield name="Not Required" value="678" />
        </application>
    </appinfo>
    ...
    </root>
在这种情况下需要选择

1234,SomeName,123

以下是我试过的陈述。评论哪里不起作用

 var appAI =
        from appinfo in doc.Root.Elements()

        let application = appinfo.Elements().First()
        let custom_field = application.Descendants()

        //.Where(x => (string)x.Attribute("name") == "Required" && (string)x.Attribute("value").Value !="" )
        select new
        {
            app_id = (string)application.Attribute("app_id"),
            app_name = (string)application.Attribute("app_name"),
            app_AI = custom_field

        };

2 个答案:

答案 0 :(得分:1)

这似乎对我有用:

var results = 
    from appInfo in d.Elements()
    let application = appInfo.Elements().First()
    let custom_field = application.Descendants()
        .Where(x => x.Attribute("name").Value == "Required" && x.Attribute("value").Value != "")
        .SingleOrDefault()
    select new
    {
        app_id = application.Attribute("app_id").Value,
        app_name = application.Attribute("app_name").Value,
        app_AI = custom_field.Attribute("value").Value
    };

我认为您的主要问题是d.Root.Elements,而不只是d.Elements

示例: https://dotnetfiddle.net/XVM1qz

答案 1 :(得分:0)

看看这是否有效。请注意,您可以链接&#34; Elements&#34;以及其他一些直接在IEnumerable<T>之外的扩展方法,以使其更简单。

from app in doc.Elements("appinfo").Elements("application")
from cf in app.Elements("customfield")
where (string)cf.Attribute("name") == "Required"
select new
{
    app_id = (string)app.Attribute("app_id"),
    app_name = (string)app.Attribute("app_name"),
    app_AI = (string)cf.Attribute("value")
};

Descendants很少是一种有用的方法,因为它可以隐藏文档中潜在的结构问题。除非我在其他地方进行验证(比如使用XSD),否则我不会使用它。