【问题标题】:Start tag expected, '<' not found in sitemap.xml — Not sure what's wrong应为开始标记,在 sitemap.xml 中未找到“<”- 不知道出了什么问题
【发布时间】:2013-04-02 12:58:35
【问题描述】:

这是我网站的 sitemap.xml 的样子:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

  <url>
    <loc>http://example.com/</loc>
    <lastmod>2013-04-02T12:45:31+00:00</lastmod>
    <changefreq>daily</changefreq>
    <priority>1</priority>
  </url>

  <url>
    <loc>http://example.com/2013/wordpress-customize-login-page/</loc>
    <lastmod>2013-03-01T12:06:00+00:00</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>

</urlset>

这里是the original sitemap。首先,我确定了valid XML markup,然后在xmlchecksitemapxml 上查看了我的站点地图。

两个站点地图验证器给出了这个错误:

Fatal Error 4: Start tag expected, '<' not found in http://example.com/sitemap.xml on line 1 column 1

在我看来,什么都没有。不知道我做错了什么。 (谷歌搜索也没有帮助。)

【问题讨论】:

  • 检查 前是否有多余的行/空格
  • @Amit 我在我的问题中提供了指向站点地图本身的链接。如您所见,&lt;?xml 标记之前没有可见/不可见行(使用 type sitemap.xml | more 检查)。
  • @Deepanshu 我不确定这与我的具体情况有何关系。
  • @TheoneManis,这很奇怪,this validator 似乎接受了它,而你链接的两个没有

标签: xml validation sitemap xml-validation


【解决方案1】:

问题一定出在服务器的某些设置 - 端口阻止/代理设置/安全设置。我将您未更改的站点地图文件复制到了我的server,两个验证器都读取并验证了它。这就是我能告诉你的全部。但您可以确定,问题不在于您的 XML 代码。

【讨论】:

  • 哦,它是 Amazon S3,我不确定它是如何干预的。我想这需要一个新问题。顺便说一句,感谢您的出色发现。 :)
  • @TheoneManis,它可能是存储桶的 ACL 设置,也许 URL 对您可见(因为 cookie)但从另一台服务器他们只是收到拒绝访问的消息?
  • @JasonSperske 不,我认为情况并非如此。我在我的问题中链接到了原始站点地图文件。它对公众可见。如果可以,请拍一张。
  • @Martin,我认为这实际上可能是无效的sitemap.xml。添加额外的xmlns:xsixsi:schemaLocation 概述here 允许文档通过。不过,这些可能是非常挑剔的验证器,因为“无效”站点地图很可能会被爬虫完全理解。
  • @JasonSperske 首先,我想说我喜欢您在上面的详细回答。但是你在这里说的话......即使添加到 xml 代码中的xsi 部分使其“更”有效......它并不能解释为什么当我将 Theone 的未更改代码放在另一台服务器上时它通过了验证器.. . 并且在这两种情况下都有效。所以它仍然让我有点困惑?
【解决方案2】:

更新:如 cmets 所述,有问题的站点地图验证器在解析 gzip 站点地图时遇到问题(在 OP 的情况下,Amazon S3 仅提供 gzip 文本响应)。


我现在认为这是服务器问题,但我有一些数据可以支持(所以我没有编辑其他答案)。这是我所做的(我关于“更有效”的原始观点仍在下方):我复制了您的文件(在浏览器中查看源代码)并创建了一个 sitemap.xml 并将其上传到我的 S3 存储桶(并确认所有这个问题中提到的验证器认为它是有效的)。然后我使用WGET 来获取您的站点地图和我复制的站点地图,这就是我发现的(用[myexamples3bucket.example] 隐藏我的存储桶名称,但您可以看到它是一个AWS IP 地址):

:~# wget http://[myexamples3bucket.example]/original.xml
--2013-04-02 13:26:42--  http://static.gnld.com/original.xml
Resolving [myexamples3bucket.example]... 207.171.189.80
Connecting to [myexamples3bucket.example]|207.171.189.80|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4578 (4.5K) [text/xml]
Saving to: `original.xml'

100%[======================================>] 4,578       --.-K/s   in 0.002s

2013-04-02 13:26:42 (1.97 MB/s) - `original.xml' saved [4578/4578]

然后我尝试获取您的站点地图:

:~# wget http://aahank.com/sitemap.xml
--2013-04-02 13:26:55--  http://aahank.com/sitemap.xml
Resolving aahank.com... 178.236.4.60
Connecting to aahank.com|178.236.4.60|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 766 [application/xml]
Saving to: `sitemap.xml'

100%[======================================>] 766         --.-K/s   in 0s

2013-04-02 13:26:55 (144 MB/s) - `sitemap.xml' saved [766/766]

这两个文件的内容非常不同。虽然“复制”的站点地图看起来完全符合您的预期,但您的原始站点地图看起来像这样:

^_�^H^@^@^@^@^@^@^CÍM�Ú0^P����^_^P×j��^O>,����=�J�ï¿ï¿½^Rq��1�^XY�Lnw���^R�^V�l
                           �jO$+U���:z�s�i�2V�Ë���u�]��Þ8_;����EcÑ9È[�M����^BwJjhw��-�4^Z^\ZJ��0I^O�0^Q�!���9��^^^]�1;^N�^]����Ǫ^Z̪^_��˪ڪB$Aɪ^M�^DmHcT-
�Ns,ªAÚª^Z�a�T�XÄV5��^[^^����A�F9^KTpÆÖe�AÔ���2È^_�$

这表明 AmazonS3 是罪魁祸首。我提供这个,以防其他人知道如何解决这个问题。祝你好运!


至于更有效,使用有效站点地图的the official definition,我对您的站点地图进行了以下(小)更改,将其上传到我的 S3 存储桶并针对您链接的两个站点进行了测试到,现在它通过了:

<?xml version='1.0' encoding='UTF-8'?>
<urlset 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"
        xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

其他一切都没有改变。这两个站点上的错误消息非常无用,但我添加的重要内容是xmlns:xsixsi:schemaLocation,它们应该通知验证器预期的格式。我认为这些是由爬虫假定的,但在两个链接服务的情况下,从技术上讲,缺少这些属性会使文档无效。

【讨论】:

  • 啊...看起来是 gzip :D 默认情况下,我的网站提供的所有文本响应都是 gzip 压缩的(因为 S3 不这样做 Vary: Accept-Encoding 我确定它只是 gzip)。似乎两个站点地图验证器站点遇到了这个问题,而这没有:validome.org/google。如果不是您的详细输入,就不会知道这一点。非常感谢!
【解决方案3】:

对我来说,问题是 UTF-16,切换到 UTF-8 并且有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多