我有一个像这样的xml文件:
<Item>
<Season>01</Season>
<EpisodeNumber>01</EpisodeNumber>
<EpisodeTitle>Title</EpisodeTitle>
</Item>
每个标记在此xml文件中只存在一次。我想使用Linq在标签中写下剧集标题。最简单的方法是什么?我确切地知道节点的名称,它只存在一次。它应该没有任何for循环或其他东西,不应该吗?
我想到了这样的事情:
XDocument xml = XDocument.Load(xmlPath);
string info = xml.Elements("EpisodeName").Value;
label1.Text = info;
但是Elements没有方法值。
这个可行,但我不能用较少的行写这个吗?
XDocument xml = XDocument.Load(xmlPath);
var info = xml.Descendants("EpisodeName");
foreach (string line in info)
{
label1.Text = line;
}
答案 0 :(得分:0)
返回值Elements()
是一个序列(一系列值),这就是它没有Value
属性的原因。如果您知道最多只有一个值,则可以使用First()
或FirstOrDefault()
来选择该值。这是一个简短的程序,它可以提取“标题”值:
static void Main()
{
// I am loading the value from a string just for example; you can do XDocument.Load instead
var xml = @"
<Item>
<Season>01</Season>
<EpisodeNumber>01</EpisodeNumber>
<EpisodeTitle>Title</EpisodeTitle>
</Item>";
var xdoc = XDocument.Parse(xml);
// this is the statement which extracts the first EpisodeTitle xml element without iterating
var titleElem = xdoc.Root
.Elements("EpisodeTitle")
.FirstOrDefault();
// check to makes sure the element exists before calling .Value
label1.Text = (titleElem == null) ? string.Empty : titleElem.Value;
}
如果xml中可能缺少值,我通常更喜欢使用FirstOrDefault()
;否则First()
会抛出异常。
如果您不想检查null(并且您正在寻找1-liner),那么您可以在选择值后使用DefaultIfEmpty()
:
label1.Text = xdoc.Root.Elements("EpisodeTitle2").Select(e => e.Value).DefaultIfEmpty().FirstOrDefault();