为什么Opera将我的网页解析为XML?

Adr*_*ore 7 html xhtml doctype opera

我刚试过在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">
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢,

阿德里安

编辑:只是为了澄清:我不是在问我网页上的错误是什么.我理解为什么这不是有效的XHTML.但是,我也在使用javascript微模板引擎,它的模板永远不是有效的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>
Run Code Online (Sandbox Code Playgroud)

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

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

EDIT3: :请不要发布任何更多的答案,我发现这种情况的原因,并记录在它下面.

Jör*_*tag 13

您的文档不是有效的HTML文档.所以,浏览器应该拒绝它.不幸的是,由于历史性的意外,大多数浏览器不会拒绝无效文档,而是尝试修复它们(通常结果非常糟糕),以便authro甚至不会注意到他的文档被破坏了.

值得庆幸的是,使用XHTML,浏览器供应商决定解决这个问题,并且实际上拒绝了无效文档.在您的情况下,您将使用application/xhtml+xmlMIME类型将文档作为XHTML传递:

# curl --head http://www.logmytime.de/
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 12529
Content-Type: application/xhtml+xml; charset=utf-8
              ^^^^^^^^^^^^^^^^^^^^^
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 2.0
X-AspNet-Version: 2.0.50727
Set-Cookie: Referrer=None; path=/
X-Powered-By: ASP.NET
Date: Tue, 04 May 2010 16:08:40 GMT
因此,浏览器拒绝您的文档(应该如此).切换到HTML时,它会尝试修复损坏的HTML.

现在,您已将您更改DOCTYPE为HTML 4.01,但您仍然将其作为XHTML提供.你现在已经做到的就是,有2个理由浏览器拒绝您的文档:它仍然是无效的,因为你没有固定的实际缺陷DOCTYPE和MIME类型不匹配.

解决此问题DOCTYPE正确方法是简单地修复无效标记并删除第class172行上无关的属性,而不是使用s和MIME类型进行混淆以使浏览器解析损坏的文档.[BTW:谁写的那份文件?缩进和格式很糟糕.]

  • @Adrian,他确实回答了你的问题.Web服务告诉浏览器您的页面是`application/xhtml + xml`,XHTML的正确doctype,导致它进入XML解析模式.但是除了doctype之外,你在页面中没有说明任何内容,因为MIME类型会忽略它.由于您的页面标记为**TOTALLY BROKEN**,浏览器会引发XML解析错误. (4认同)
  • @Adrian Grigore:首先,如果你想使用非XHTML,那你为什么要把它作为`application/xhtml + xml`服务呢?其次,它与XHTML没有任何关系.无论如何,您的文档无效*HTML*.无论您将其解释为XHTML还是HTML,都无关紧要,因为它不是*. (3认同)
  • @Andrian,您的Web服务器将其作为XHTML提供,因为这是IIS配置为默认使用任何ASP.NET网页的方式. (2认同)

小智 7

您有两次指定的"class"属性.

alt text http://img504.imageshack.us/img504/9243/logmytime.png

良构形成约束:独特的Att规范:

属性名称不得在同一个start-tag或empty-element标记中出现多次.

  • @Adrian Grigore:这个*确实*回答你的问题.这很简单:规范*禁止*浏览器显示损坏的文档.期.如果要显示文档,请进行修复.另外,你写道:"我检查了浏览器的源输出,以确保**我没有犯任何错误**".显然,你没有仔细检查,因为你错过了这个. (5认同)

Adr*_*ore 5

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

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


hal*_*ors 5

你得到了正确的答案(HTTP内容类型标题强制XML解析),它似乎是固定的.我只想添加一个小小的提示,告诉你如何从Opera本身中找出错误.两种可能的方式:

1)信息面板

这在默认情况下不可见,但是如果您打开左侧的面板栏(如果您没有看到,请按F4切换),然后单击底部的小加号,您可以在菜单中启用"信息" .

信息面板显示有关当前打开的页面的各种信息,包括编码和MIME类型.

2)Opera Dragonfly

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

转到"网络"选项卡,然后重新加载网站.您将看到该请求并可以查看标题.将其与Firebug中的相应信息进行比较,可以向您展示Content-type标头的不同之处.(在这里,你还会看到歌剧发送"接受"报头包含"应用程序/ xhtml + xml".这意味着"嗨服务器,如果你碰巧有真正的XHTML格式的文件我也明白就好了."也许您的服务器端框架看到该标头并错误地响应XHTML内容类型,即使内容无效?)