【问题标题】:Why does Opera parse my web page as XML?为什么 Opera 将我的网页解析为 XML?
【发布时间】:2011-02-15 13:06:30
【问题描述】:

我刚刚尝试在 Opera(版本 10.50)中查看我的网站 http://www.logmytime.de/,它给了我一个“xml 解析失败错误”并拒绝显示网页。

我可以选择“将文档重新解析为 HTML”,然后页面就可以正常工作,但这几乎不能解决我的问题。

奇怪的是,设置一个 HTML(而不是 XTHML)doctype 后仍然出现错误:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
          "http://www.w3.org/TR/html4/loose.dtd">

我检查了浏览器的源输出,以确保我没有对 Doctype 犯任何错误我什至在 Firebug 中查看了同一个网页,它显示的 Content-Type 为 text/html; .

那么,为什么 Opera 仍然尝试将我的网页解析为 XML?

谢谢,

阿德里安

编辑: 澄清一下:我不是在问我网页上的错误是什么。我明白为什么这不是有效的 XHTML。但是,我也在使用javascript micro templating engine,它的模板永远不是有效的 XML,这就是为什么我需要浏览器将我的整个网站解析为 HTML,而不是 XHTML。为了演示这一点,我只是在网页中插入了一个示例模板。

<script type="text/html" id="StopWatchTemplate" > 

<h1><a href="#" onclick="TimeEntriesList.EditTimeEntry('<#=timeEntryID#>')"><#=currentlyRunning?"Aktueller":"Letzter"#> Stoppuhr-Zeiteintrag</a></h1>
<%-- Stoppuhr - Ende--%>

</script>

在 Opera 中打开页面时,您可以看到模板现在会产生 XML 解析错误,即使页面的 doctype 仍然是 HTML。

编辑 2::只是为了让这一点更清楚:我不是在问为什么我的网页不是有效的 XHTML。我在问为什么 Opera 试图将其解析为 XHTML,尽管 HTML 文档类型。

Edit3::请不要再发布任何答案,我已经在下面找到了这个原因和documented它。

【问题讨论】:

  • 您的标记是否有问题(即标签未正确关闭?)我正在尝试通过 w3 验证器运行它,但它现在没有为我加载。
  • “为了证明这一点,我刚刚在网页中插入了一个示例模板。” - 你到底插入了什么,在哪里插入?
  • @M28,但是 XHTML IS XML 和因此任何解析错误都会使浏览器吠叫。
  • @M28:不,但 XHTML 始终是 XML。
  • 您的网页也不是有效的 HTML,所以即使 if 您知道如何将其解析为 HTML,这仍然无法解决问题。问题是,您的网页已损坏。解决方案是修复它。真的就是这么简单。事实上,您可能已经修复了十次,就在您编写 cmets 所花费的时间。

标签: html xhtml opera doctype


【解决方案1】:

您的文档不是有效的 HTML 文档。所以,浏览器应该拒绝它。不幸的是,由于历史事故,大多数浏览器不会拒绝无效文档,而是尝试修复它们(通常结果很糟糕),因此 authro 甚至不会注意到他的文档已损坏。

谢天谢地,浏览器供应商决定使用 XHTML 解决这个问题,实际上拒绝无效文档。在您的情况下,您将文档作为具有 application/xhtml+xml MIME 类型的 XHTML 交付:

# curl --head http://www.logmytime.de/
HTTP/1.1 200 正常
缓存控制:私有
内容长度:12529
内容类型:application/xhtml+xml;字符集=utf-8
              ^^^^^^^^^^^^^^^^^^^^^
服务器:Microsoft-IIS/7.5
X-AspNetMvc-版本:2.0
X-AspNet-版本:2.0.50727
设置 Cookie:Referrer=None;路径=/
X-Powered-By: ASP.NET
日期:2010 年 5 月 4 日星期二 16:08:40 GMT
因此,浏览器会拒绝您的文档(应该如此)。当您切换到 HTML 时,它会尝试修复损坏的 HTML。

现在,您已将 DOCTYPE 更改为 HTML 4.01,但您仍然将其作为 XHTML 交付。您现在所取得的成就是浏览器拒绝您的文档有两个原因:它仍然无效,因为您还没有修复实际的错误DOCTYPE并且 MIME 类型不匹配。

与其使用DOCTYPEs 和 MIME 类型来让浏览器解析损坏的文档,解决此问题的正确方法是简单地修复无效标记和删除第 172 行无关的 class 属性。[顺便说一句:谁编写了该文档?缩进和格式是糟糕。]

【讨论】:

  • +1 用于窃取我的答案。该文档在我看来是自动生成的,但考虑到 ASP.NET MVC 不会为您生成页面代码,这有点奇怪。他可能正在使用第三方控件或自动生成 HTML 代码的东西。
  • @Adrian,他确实回答了你的问题。 Web 服务告诉浏览器您的页面是 application/xhtml+xml,这是 XHTML 的正确文档类型,这会导致它进入 XML 解析模式。但是您在页面中什么都不告诉它,除了由于 MIME 类型而被忽略的 doctype。由于您页面的标记完全损坏,浏览器会引发 XML 解析错误。
  • @Adrian Grigore:首先,如果您想使用非 XHTML,那么您为什么将其作为 application/xhtml+xml 提供服务?其次,它与 XHTML 没有任何关系。无论如何,您的文档是无效的 HTML。将其解释为 XHTML 还是 HTML 并不重要,因为它都不是
  • @Andrian,您的 Web 服务器将其作为 XHTML 提供服务,因为这是 IIS 在默认情况下对任何 ASP.NET 网页进行配置的方式。
  • 您可以在dev.opera.com 上阅读有关它的内容。星巴克也有同样的问题。流氓图书馆。
【解决方案2】:

你有两次指定的“类”属性。

来自Well-formedness constraint: Unique Att Spec

一个属性名称不能在同一个起始标签或空元素标签中出现多次。

【讨论】:

  • -1:感谢您的回复,但您没有回答我的问题。请看我上面的编辑。
  • 关于您的问题:“您为什么要故意生成无效文档?”:请参阅我上面的编辑。
  • @Adrian Grigore:这确实回答了你的问题。很简单:规范禁止 浏览器显示损坏的文档。时期。如果您希望显示您的文档,请修复它。此外,您写道:“我检查了浏览器的源输出以确保 我没有犯任何错误”。显然,你没有仔细检查,因为你错过了这个。
【解决方案3】:

您得到了正确的答案(HTTP 内容类型标头强制进行 XML 解析)并且它似乎已修复。我将添加一个小提示,说明如何从 Opera 本身找出问题所在。两种可能的方式:

1) 信息面板

这个默认是不可见的,但是如果你打开左边的面板栏(看不到就按F4切换),然后点击底部的小加号,可以启用“信息”在菜单中。

信息面板显示有关当前打开的页面的一些分类信息,包括编码和 MIME 类型。

2) 歌剧蜻蜓

按 Ctrl-Shift-I 打开开发者工具(或通过菜单进入工具 > 高级 > Opera Dragonfly)

转到“网络”标签,然后重新加载网站。您将看到请求并可以查看标头。将此与来自 Firebug 的相应信息进行比较,您会发现 Content-type 标头的差异。 (在这里您还会看到 Opera 发送了一个包含“application/xhtml+xml”的“Accept”标头。这意味着“您好,服务器,如果您碰巧有这个文件是真正的 XHTML 格式,我会理解的。”。也许您的服务器端框架看到了该标头并错误地响应了 XHTML 内容类型,即使内容无效?)

【讨论】:

  • 感谢您提供有关开发人员工具和信息面板的信息。它应该可以方便地进行进一步调试。
【解决方案4】:

如果其他人有同样的问题:正如 DeveloperArt 所建议的,它可以通过页面元素中的简单 ContentType="text/html" 属性来修复。

编辑:问题实际上是由我在网络项目中使用的 mobile.Browser 文件的错误引起的。上面的解决方法有效,但在我的情况下并不是真的必要。有关详细信息,请参阅this answer

【讨论】:

  • 我也在努力记录这一点。您还记得您使用的是哪个版本的 MDBF 吗?
  • @Scott Hanselman:我真的不能再说什么了,因为几个月前我从我的项目中删除了 MDBF 以支持 51Degrees.mobi 并将版本控制切换到 Mercurial。但是,我很确定我是在去年 8 月之后下载了 MDBF。
【解决方案5】:

似乎服务器正在为不同的用户代理提供不同的 mime 类型。 Firefox 正在获取 text/html,但 Opera(以及根据 Jörg W Mittag 的 curl)正在获取 application/xhtml+xml。您的网站有任何内容协商代码吗?

【讨论】:

【解决方案6】:

在另一台电脑上尝试以确保您没有遇到缓存问题。

【讨论】:

  • 我在另一台电脑上试了下,问题依旧。
【解决方案7】:

页面代码缓存在您的浏览器中,这就是您继续看到错误的原因。您最初看到了错误,因为您的代码可能无效。

【讨论】:

  • 我在另一台电脑上试了下,问题依旧。
【解决方案8】:

这是因为你已经告诉它...

<html xmlns="http://www.w3.org/1999/xhtml">

【讨论】:

  • 我也考虑过这一点,但在这种情况下并不真正相关。问题确实是服务器发送的内容类型为application/xhtml+xml;默认情况下操作浏览器和几乎所有其他浏览器的 text/html。我仍然不确定这是为什么(我没有在服务器端编写任何依赖于浏览器的代码),但至少我现在知道如何覆盖它。
【解决方案9】:

应用程序/xhtml+xml

如果服务器将页面作为 application/xhtml+xml 发送,浏览器会按照规范将其解析为 XML。解析为 XML 时,第一个 XML 格式错误将停止解析,客户端(浏览器)通常会显示错误消息。

文本/html

text/html 的解析器更宽容(由于 html 开发的历史)。

更改 mime 类型

要更改服务器发送的内容类型,您必须覆盖 HTTP 标头值:Content-Type。这可以通过服务器端的脚本语言来完成,有时也可以在服务器的配置中完成,例如 Apache。我不知道 Microsoft-IIS/7.5 如何在 URI 基础上进行指定。

内容类型:application/xhtml+xml;字符集=utf-8 要么 内容类型:文本/html;字符集=utf-8

【讨论】:

    【解决方案10】:

    这主要发生在 ASP.NET 中,因为它将歌剧的内容类型设置为 application/xhtml+xml。为了解决这个问题。您需要将内容类型设置为 text/html。解决此问题的最佳方法是将以下代码添加到 App_Browser 文件中的 .browser 配置文件中。



    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      相关资源
      最近更新 更多