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);
我正在尝试在我的 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
在根元素 中找到 - 您提供了元素的 本地名称 ,但由于命名空间默认设置,它们实际上位于
"http://www.sitemaps.org/schemas/sitemap/0.9"
的命名空间中,而您不在指定,所以它不会找到任何元素 - 您正在寻找最大
DateTime
值的 序列,每个url
元素一个,这几乎肯定不是您想做的- 您可能想要 所有 个 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);