iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
SideProject30

我想自己刻部落格系列 第 25

建立 sitemap.xml

  • 分享至 

  • xImage
  •  

每個網站或是部落格都有成千上百的內容,如果要讓搜尋引擎,像是 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:xsixmlns:imagexsi: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 上為主。


上一篇
資料匯入時注意細節
下一篇
建立帳號相關 UserService
系列文
我想自己刻部落格31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言