读取xml中一个特定节点的值

时间:2013-11-26 14:46:43

标签: xml linq-to-xml

我有一个像这样的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;
}

1 个答案:

答案 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();