我希望我的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
};
答案 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
。
答案 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),否则我不会使用它。