XML Parser返回特定节点

时间:2014-06-16 06:06:08

标签: c# xml visual-studio-2010 c#-4.0 linq-to-xml

我有这样的XML

<?xml version="1.0" ?>
<customers>
  <customer>
    <date>22 Aug 2014</date>
    <name>Kevin Anders</name>
    <phone>555.555.5555</phone>
  </customer>
  <customer>
    <date>23 Aug 2014</date>
    <name>Staci Richard</name>
    <phone>555.122.1552</phone>
  </customer>
  <customer>
    <date>25 Aug 2014</date>
  </customer>
</customers>

在XML中,缺少某些节点,但每个元素中都存在日期节点。我有大约200个节点,但我想根据日期解析xml,只需要返回前4个日期。例如今天是6月16日然后我的xml获取最新的日期节点并返回接下来三天匹配节点。我能够解析节点,但不知道如何根据日期返回顶级节点

public static IEnumerable<Customer> StreamBooks(string uri) 
{
    using (XmlReader reader = XmlReader.Create(uri))
    {
        string name = null;
        string phone = null;

        reader.MoveToContent();
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element
                && reader.Name == "customer")
            {
                while (reader.Read())
                {
                     if (reader.NodeType == XmlNodeType.Element &&
                         reader.Name == "name")
                     {
                         name = reader.ReadString();
                         break;
                     }
                }
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element &&
                        reader.Name == "phone")
                    {
                        phone = reader.ReadString();
                        break;
                    }
                }
                yield return new Customer() { Name = name, Phone  = phone };
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我首先删除您当前的代码以检索一系列客户,而只是使用LINQ to XML:

var customers = XDocument.Load(uri)
                         .Root.Elements("customer")
                         .Select(x => new Customer {
                                     Date = (DateTime) x.Element("date"),
                                     Name = (string) x.Element("name"),
                                     Phone = (string) x.Element("phone")
                                 });

这要求您将日期格式更改为&#34; yyyy-MM-dd&#34;这是一种标准的XML日期格式。 (所以&#34; 2014-08-23&#34;而不是&#34; 2014年8月23日&#34;例如。)

如果 保留现有的日期格式,您可以使用:

var customers = XDocument.Load(uri)
    .Root.Elements("customer")
    .Select(x => new Customer {
        Date = DateTime.ParseExact(x.Element("date").Value, "d MMM yyyy",
                                   CultureInfo.InvariantCulture),
        Name = (string) x.Element("name"),
        Phone = (string) x.Element("phone")
    });

如果您因其他原因需要整个客户列表,您可能还希望在ToList()之后添加对Select的来电。

在此之后,原始数据源是XML的事实无关紧要。然后,您可以使用OrderByDescending按日期排序最新的第一个,Take来限制结果:

var recentCustomers = customers.OrderByDescending(c => c.Date)
                               .Take(4);

LINQ是用于查询数据的非常有用的技术。我强烈建议您了解有关is的更多信息 - 搜索MSDN上的信息,教程等。