XML站点地图生成器

粘贴每行一条的 URL 列表,逐行校验格式后生成符合 sitemaps.org 0.9 协议的 sitemap.xml 文本,& 等五个 XML 特殊字符自动转义,可复制可下载,全部在本页浏览器内完成。

提示:输入框里按 Ctrl + Enter(macOS 用 Cmd + Enter)可直接生成;单独按 Enter 是换行。

使用方法

  1. 把要收录的 URL 逐行粘贴到「URL 列表」框,每行一条。输入框已预置 3 条示例(第 3 条带查询参数,用来演示转义),打开页面即可直接生成。
  2. 按需设置三个可选参数:lastmod 填 ISO 8601 格式的日期(示例 2026-10-01),留空则不输出该元素;changefreq 从 7 个枚举值里选一个(示例 weekly);priority 填 0.0 到 1.0(示例 0.8)。
  3. 点「生成 sitemap.xml」,或按 Ctrl + Enter,下方输出完整文本。
  4. 如果某行不是以 http:// 或 https:// 开头、含空格、或超过 2048 个字符,红色提示区会指明第几行、错在哪、怎么改,该行不会进入结果。
  5. 确认后点「复制结果」,或点「下载 sitemap.xml」保存成 UTF-8 编码的文件,上传到网站根目录即可。

这个XML站点地图生成器能解决什么问题

手工拼 sitemap.xml 最容易在两处翻车:一是 URL 里带查询参数,& 没有写成 &,整份文件过不了 XML 解析;二是行末混进不可见字符或格式不对的行,提交给搜索平台后被整批拒收。这个 XML站点地图生成器把这两类问题都挡在生成之前:每行先过三道校验(协议头、空白字符、2048 字符上限),带行号给出中文错误说明,通过后再统一做 XML 五实体转义,输出的文件可以直接通过 XML 解析器。

典型场景有三个:中小站点改版后要提交一份新的 URL 清单;CMS 不支持自动 sitemap,只有一份导出的 URL 列表;临时给活动页、专题页做一份单独的 sitemap 用 sitemap 索引文件挂到主文件里。本页只负责从 URL 列表生成单份 sitemap 文本——不抓取你的网站确认 URL 是否可达,不做 sitemap 索引文件的拼装,也从 CSV 之类的表格文件里提取 URL 那样的事不归它管。

生成原理与协议规则说明

输出文件遵循 sitemaps.org 0.9 协议,这是 Google、Bing 等搜索引擎共同支持的事实标准。协议对文件的要求可以归纳为三要素加两条上限:

要素一 <loc> 必填:每个 <url> 块必须有且只有一个 <loc>,内容是单个 URL 的规范写法,且必须是 XML 转义后的形式——这是唯一强制转义的位置。XML站点地图生成器对每一行做的就是这道校验加转义的流水线。

要素二 <lastmod> 用 ISO 8601:可选项,格式为 YYYY-MM-DD,或带时间的 YYYY-MM-DDThh:mm:ss 并可带时区后缀(+08:00 或 Z)。本页对输入做同样的正则校验,格式不合规会拒绝而不是原样写进文件——写错的 lastmod 比没有更糟,搜索引擎可能因此低估真实更新时间。

要素三 changefreq 与 priority 可选且只有提示意义:changefreq 只允许 always、hourly、daily、weekly、monthly、yearly、never 这 7 个枚举值;priority 取 0.0 到 1.0,只表示同一站点内页面的相对权重,不会拿来和其他网站比较。需要说明的是,Google 官方文档已注明它会忽略 changefreq 与 priority,lastmod 在内容准确时仍会被使用——所以本页把 lastmod 做成带校验的输入,把 priority 做成可选元素,空值直接不输出。

两条上限:单份 sitemap 解压后不超过 50 MB、不超过 50000 条 <url>。超限时正确做法不是硬塞,而是拆成多份文件再写一个 sitemap 索引文件。转义实现上,五个 XML 实体(&amp; &lt; &gt; &quot; &apos;)必须先替换 & 再替换其余四个,顺序反了会把已经生成的 &amp; 二次转义成 &amp;amp;,这是手写替换逻辑最常见的 bug。

完整示例(数值仅作演示)

示例条件:输入框预置的 3 条 URL,lastmod 2026-10-01、changefreq weekly、priority 0.8。第 3 条 URL 含一个 &,输出里被转义为 &amp;amp;(文件中的真实字符)。生成结果共 21 行、UTF-8 编码下 598 字节:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://liuquan.net/</loc>
    <lastmod>2026-10-01</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://liuquan.net/jisuanqi/</loc>
    <lastmod>2026-10-01</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://liuquan.net/list?page=2&amp;amp;sort=asc</loc>
    <lastmod>2026-10-01</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>
</urlset>

转义的体积代价可以量化:一条 47 个字符、含 2 个 & 的 URL,转义后 55 个字符,多出的 8 个字符全部来自两个 &amp;。整个 <url> 块的固定骨架(不含 loc 内容)是 241 字节,这决定了同一条数下文件的最低体积。

转义规则与参数对照表

XML 只有五个预定义实体,逐个对照如下(顺序即替换顺序,& 必须最先):

原字符转义后出现的典型位置
&&amp;查询参数分隔符,URL 里最常见
<&lt;URL 参数值里极少见,但出现即致命
>&gt;同上
"&quot;属性值用双引号包裹时必须转义
'&apos;单引号包裹的属性值里必须转义

三个可选参数的取值与含义对照:

参数允许值留空时说明
lastmodYYYY-MM-DD 或带 T 的完整时间加时区不输出该元素格式不合规会被拒绝并指出写法
changefreqalways / hourly / daily / weekly / monthly / yearly / never不允许留空(下拉框必有值)7 个枚举之外的值协议不允许
priority0.0 到 1.0,步长 0.1不输出该元素0.5 是协议文档给出的默认参考值

输入范围、边界与上限说明

常见问题

输出里的 &amp; 是错了吗?

不是。你的 URL 里有一个 &,XML 规范要求它在文件里必须写成 &amp;,否则 XML 解析器会把它当成新实体的开头直接报错。搜索引擎读取时会自动还原成原来的 &,提交时不需要手工改回去。

priority 和 changefreq 还有用吗?

对 Google 而言作用有限:官方文档已注明忽略这两个元素。lastmod 不同——只要内容准确就会参与收录判断。所以本页允许这两个参数留空输出更精简的文件,把精力放在把 lastmod 填对上。

URL 超过 50000 条怎么办?

拆成多份 sitemap(每份不超过 50000 条、50 MB),再生成一个 sitemap 索引文件——结构类似,把 <url> 换成 <sitemap>、<loc> 指向各分文件。索引文件本身最多可嵌套一层,不允许索引指向索引。

lastmod 应该填内容更新时间还是文件生成时间?

填该页面内容最后一次实质性变更的时间,不是 sitemap 的生成时间。全站填同一个「今天」等于没提供信息,格式不对还会被解析失败——这也是本页对 lastmod 做正则校验的原因。

需要把全站每个 URL 都放进去吗?

不需要也不建议。只放希望被收录的规范版 URL:带参数的变体、跳转中间页、登录页都应排除;同一内容有多个 URL 时只放规范版那个,否则等于告诉爬虫同一页面有多个副本。

生成的文件放在哪里、怎么告诉搜索引擎?

惯例放在网站根目录命名为 sitemap.xml,然后在 robots.txt 里加一行 Sitemap: https://你的域名/sitemap.xml,或在搜索平台的站长后台直接提交。两种方式任选其一即可,都做也不冲突。

带汉字的 URL 要先做百分号编码吗?

XML 这一层不需要:声明了 UTF-8 后汉字可以直接写。但 HTTP 协议层要求请求行里是编码后的字节,主流搜索引擎对未编码的 IRI 会自行处理,稳妥做法仍是把路径部分按 RFC 3986 百分号编码后再粘进来。

工具会访问我的网站或保存 URL 列表吗?

都不会。校验、转义、生成全部在本页 JavaScript 里完成,没有网络请求,也没有任何存储,刷新页面输入就清空。你可以在开发者工具的 Network 面板核实——点「生成」前后不会出现任何新请求。

相关工具