максимальный DateTime в XML - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь найти максимальное значение DateTime в моем XML.

Вот пример 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 пусто.

1 Ответ

0 голосов
/ 02 июня 2018

Здесь есть три проблемы:

  • Вы звоните xdoc.Elements("url"), который никогда не вернет никаких элементов, потому что нет элементов 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);
...