2013-11-26 64 views
1

我有一个XML文件是这样的:阅读一个特定节点的值在XML

<Item> 
    <Season>01</Season> 
    <EpisodeNumber>01</EpisodeNumber> 
    <EpisodeTitle>Title</EpisodeTitle> 
</Item> 

每个标签存在于这个XML文件只有一个时间。我想用Linq在标签中编写Episode Title。什么是最简单的方法来做到这一点?我确切地知道节点的名称,它只存在一次。它应该没有任何for循环或什么东西,不是吗?

我想过这样的事情:

XDocument xml = XDocument.Load(xmlPath); 
string info = xml.Elements("EpisodeName").Value; 
label1.Text = info; 

但元素有没有方法的价值。

这一个工程,但我不能写在较少的行?

XDocument xml = XDocument.Load(xmlPath); 
var info = xml.Descendants("EpisodeName"); 
foreach (string line in info) 
{ 
    label1.Text = line; 
} 

回答

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; 
} 

我通常喜欢使用FirstOrDefault(),如果有可能的值从XML丢失;否则First()会抛出异常。

如果你不喜欢以检查空(和你正在寻找一个1-衬垫),那么你可以选择出价值后使用DefaultIfEmpty()

label1.Text = xdoc.Root.Elements("EpisodeTitle2").Select(e => e.Value).DefaultIfEmpty().FirstOrDefault();