XML 中的最大日期时间

maximum DateTime in XML

我正在尝试在我的 XML 中找到最大 DateTime 值。

这是 XML 的示例:

<?xml version="1.0" encoding="utf-16"?>
<?xml-stylesheet type='text/xsl' href='http://127.0.0.123/sitemaps/xmltemplate/main-sitemap.xsl'?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
  <url>
    <loc>http://127.0.0.123/?????</loc>
    <lastmod>2018-05-13</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.1</priority>
  </url>
  <url>
    <loc>http://127.0.0.123/?????-????</loc>
    <lastmod>2018-05-26</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.1</priority>
  </url>
</urlset>

这是我尝试使用的代码:

XDocument xdoc = XDocument.Load(FullAddressXML);
var maxId = xdoc.Elements("url").Select(x => new {                
        MaxDateTime = x.Descendants("lastmod").Max(y=>(DateTime)y)
    });

当我运行这个的时候,maxId是空的。

这里存在三个问题:

  • 您调用的 xdoc.Elements("url") 永远不会 return 任何元素,因为没有 url 元素作为文档的直接后代;您希望 xdoc.Root.Elements 在根元素
  • 中找到 url 元素
  • 您提供了元素的 本地名称 ,但由于命名空间默认设置,它们实际上位于 "http://www.sitemaps.org/schemas/sitemap/0.9" 的命名空间中,而您不在指定,所以它不会找到任何元素
  • 您正在寻找最大 DateTime 值的 序列,每个 url 元素一个,这几乎肯定不是您想做的- 您可能想要 所有 个 URL 中的最大值。

此外,您不清楚为什么要使用单个 属性 创建新的匿名类型 - 这 通常 没有用。

这是一个适用于您的示例数据的示例:

using System;
using System.Linq;
using System.Xml.Linq;

public class Test
{
    static void Main()
    {
        var doc = XDocument.Load("test.xml");
        XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/0.9";
        var max = doc.Root
            .Elements(ns + "url")
            .Max(url => (DateTime) url.Element(ns + "lastmod"));
        Console.WriteLine(max);
    }
}

或者,如果永远不会有任何其他 lastmod 元素,您可以只在文档本身上使用 Descendants

var max = doc.Descendants(ns + "lastmod").Max(x => (DateTime) x);