2012-10-01 54 views
2

让说,我有下面的XML文件的最后一个元素获得一个XML文件

<Users> 
<User> 
    <Name>David</Name> 
    <Date>9/30/2012 10:52:00 PM</Date> 
</User> 
<User> 
    <Name>David</Name> 
    <Date>9/30/2012 11:02:05 PM</Date> 
</User> 
<User> 
    <Name>David</Name> 
    <Date>9/30/2012 11:52:00 PM</Date> 
</User> 
<User> 
<Name>Michelle</Name> 
<Date>9/30/2012 11:02:13 PM</Date> 
</User> 
<User> 
    <Name>Michelle</Name> 
    <Date>9/30/2012 11:02:54 PM</Date> 
</User> 
</Users> 

我会喜欢看大卫的最后日期,并把它放在一个字符串,在我的C#程序,在这种情况下,将“二零一二年九月三十零日下午11点52分00秒”我有以下的代码是假设读取特定用户的日期,但它不工作

 public void readLastDate(string name) 
     {  
     string filePaths = "logins.xml"; 
     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(filePaths); 

     xmlDoc.DocumentElement.SetAttribute("searching",name); 
     XmlNodeList tests = xmlDoc.SelectNodes("//Users[Name =/*/@searching]/User"); 
     foreach (XmlNode test in tests) 
     { 
      string myDate = test.SelectSingleNode("LoginDate").InnerText; 
      InfoBox.Items.Add("Last Date:" + myDate); 

     } 

此外,如何将我处理如果我想读取不在xml文件中的用户的日期,则会出现错误。 }

+0

您是否与XmlDocument绑定? LINQ to XML使得所有这些都变得相当简单 - 我个人并不是XPath的粉丝,尽管如果你对它感到满意,那么切换到LINQ to XML的理由就会减少...... –

+0

我不是很熟悉linq to XML,我会怎么做所有这些在LINQ到XML? –

回答

2

您可以使用LINQ到XML,例如是怎么读的最后日期大卫

var xDoc = XDocument.Load("logins.xml"); 

var userElements = xDoc.Descendants("User") 
    .Where(x => x.Element("Name").Value == "David") 
    .ToList(); 

if (userElements.Any()) 
{ 
    string lastDate = userElements.Select(x => 
             DateTime.Parse(x.Element("Date").Value)) 
     .OrderByDescending(x => x) 
     .First() 
     .ToString(); 
} 

的更多信息:

http://msdn.microsoft.com/en-us/library/bb387098.aspx

+0

谢谢,如果搜索不在xml文件中的用户,我将如何处理错误? –

+0

@IsraelRodriguez:更新了我的答案 –

+0

即时得到这个错误:错误非可调用成员“System.Nullable .HasValue”不能使用的方法等 –

2

在XPath,(/Users/User[Name = 'David'])[position() = last()]

但是,首先您必须修复XML文件中的错误;-)

0

我也会使用Linq-to-XML。我认为我的方法很干净。

var result = 
    XDocument 
     .Load(fileName) 
     .Element("Users") 
     .Elements("User") 
     .Where(xe => xe.Element("Name").Value == "David") 
     .Select(xe => DateTime.Parse(xe.Element("Date").Value)) 
     .OrderByDescending(d => d) 
     .FirstOrDefault(); 

if (result == default(DateTime)) 
{ 
    /* no value */ 
}