每個網站或是部落格都有成千上百的內容,如果要讓搜尋引擎,像是 Google Search ,知道一個網站有哪些頁面可以搜尋。定義好 Sitemap 列出內容清單,是必不可少的。
目前我的部落格 sitemap 位於 https://dannyliu.me/post-sitemap.xml
結構如下
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="//dannyliu.me/wp-content/plugins/wordpress-seo-premium/css/main-sitemap.xsl"?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://dannyliu.me/</loc>
<lastmod>2023-07-17T06:32:51+00:00</lastmod>
</url>
<url>
<loc>https://dannyliu.me/%e9%95%b7%e5%ba%9a%e5%86%b7%e7%9f%a5%e8%ad%981%ef%bc%9aled%e7%87%88%e7%ae%a1%e8%88%87%e5%82%b3%e7%b5%b1%e7%87%88%e7%ae%a1-%e5%a4%96%e8%a7%80%e6%af%94%e8%bc%83/</loc>
<lastmod>2017-02-13T11:59:14+00:00</lastmod>
</url>
<url>
<loc>https://dannyliu.me/hello-world/</loc>
<lastmod>2017-02-13T11:59:15+00:00</lastmod>
</url>
</urlset>
<urlset></urlset>
是我們清單的主體,裡面每個 <url></url>
都是一篇可以被索引的網址或文章<loc></loc>
是實際路徑,<lastmod></lastmod>
最後更新時間。
我們只要產生這種結構的文件就可以了
另外我們 <urlset></urlset>
中,有多個命名空間宣告,如xmlns
等
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd"
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
我目前查詢到的資料只有 xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
是必須的,不過我還是照原本的 xml 樣式,加上 xmlns:xsi
、xmlns:image
、xsi:schemaLocation
我使用 XDocument
來實作的結果如下,最後是把 xml 轉成字串輸出,ContentType 要指定為 application/xml
另外我查到的結果,xml 開頭版本宣告 XDeclaration
這段可以省略,實際 xmlDoc.ToString() 的結果也沒有這段。
[Route("/sitemap.xml")]
public IActionResult SitemapXml()
{
var xmlDoc = new XDocument(
new XDeclaration("1.0", "UTF-8", "yes")
);
XNamespace sitemap = "http://www.sitemaps.org/schemas/sitemap/0.9";
var urlset = new XElement(sitemap + "urlset");
// 這段不是必須
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XNamespace image = "http://www.google.com/schemas/sitemap-image/1.1";
XNamespace schemaLocation = "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd";
urlset.Add(new XAttribute(XNamespace.Xmlns + "xsi", xsi));
urlset.Add(new XAttribute(XNamespace.Xmlns + "image", image));
urlset.Add(new XAttribute(xsi + "schemaLocation", schemaLocation));
// 這段不是必須 End
var posts = _postService.GetAll(1, int.MaxValue);
foreach (var post in posts)
{
var loc = $"{Request.Scheme}://{Request.Host}/{post.Path}";
var element = new XElement("url",
new XElement("loc", loc),
new XElement("lastmod", post.UpdateDate.ToString("yyyy-MM-ddThh:mmzzz", CultureInfo.InvariantCulture))
);
urlset.Add(element);
}
xmlDoc.Add(urlset);
return Content(xmlDoc.ToString(), "application/xml");
}
實際程式碼以 GitHub 上為主。