代码之家  ›  专栏  ›  技术社区  ›  Adrian Grigore

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

  •  7
  • Adrian Grigore  · 技术社区  · 15 年前

    我刚试着浏览我的网站 http://www.logmytime.de/ 在Opera(10.50版)中,它给了我一个“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中查看了同一个网页,它显示了文本/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 doctype。

    EdTe3: :请不要再发布任何答案,我已经找到原因,并且 documented 它在下面。

    10 回复  |  直到 13 年前
        1
  •  13
  •   Jörg W Mittag    15 年前

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

    值得庆幸的是,有了XHTML,浏览器供应商决定解决这个问题,并实际拒绝无效的文档。在您的案例中,您将以XHTML的形式交付文档, application/xhtml+xml MIME类型:

    # 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交付。你现在所取得的成就就是 浏览器拒绝您的文档的原因:它仍然无效,因为您尚未修复实际的错误。 这个 文档类型 而mime类型不匹配。

    而不是到处乱搞 文档类型 s和mime类型,以便让浏览器解析您的损坏文档, 对的 解决这个问题的方法是简单地修复无效的标记并删除无关的 class 第172行的属性。[顺便问一句:是谁写的那个文件?缩进和格式是 可怕的 ]

        2
  •  7
  •   user151323    15 年前

    您已经指定了两次“class”属性。

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

    Well-formedness constraint: Unique Att Spec :

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

        3
  •  5
  •   hallvors    15 年前

    您得到了正确的答案(HTTP Content-Type头强制XML解析),似乎已经修复了。我只是给你一个小小的提示,告诉你怎么能从歌剧本身中找出问题所在。两种可能的方法:

    1)信息面板

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

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

    2)歌剧《蜻蜓》

    按ctrl-shift-i打开开发人员工具(或浏览菜单到工具>高级>Opera蜻蜓)

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

        4
  •  5
  •   Community CDub    8 年前

    如果其他人也有同样的问题:正如developerart建议的那样,可以在page元素中使用简单的contenttype=“text/html”属性来修复它。

    编辑: 这个问题实际上是由我在我的Web项目中使用的mobile.browser文件的错误引起的。上面的解决方法是可行的,但在我的情况下,它并不是真正必要的。见 this answer 了解更多详细信息。

        5
  •  1
  •   Alohci    15 年前

    服务器似乎为不同的用户代理提供了不同的mime类型。火狐正在获取文本/html,但Opera(和curl根据J_¶rg w mittag)正在获取application/xhtml+xml。你的网站有内容协商代码吗?

        6
  •  0
  •   Chris Thornton    15 年前

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

        7
  •  0
  •   austin cheney    15 年前

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

        8
  •  0
  •   Fenton    15 年前

    这是因为你告诉过…

    <html xmlns="http://www.w3.org/1999/xhtml">
    
        9
  •  0
  •   karlcow    14 年前

    应用程序/xhtml+xml

    如果服务器将页面发送为application/xhtml+xml,浏览器将根据规范的要求将其解析为xml。当解析为XML时,第一个XML格式良好的错误将停止解析,客户机(浏览器)通常会显示一条错误消息。

    文本/ HTML

    文本/HTML的解析器更为宽容(由于HTML开发的历史)。

    更改mime类型

    要更改服务器发送的内容类型,必须重写HTTP头值:content-type。这可以通过服务器端的脚本语言来实现,有时也可以通过服务器的配置(例如Apache)来实现。我不知道Microsoft IIS/7.5如何在URI基上指定。

    内容类型:application/xhtml+xml;charset=utf-8 或 内容类型:text/html;charset=utf-8

        10
  •  0
  •   getsrirams    14 年前

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

    <capability name=“preferredrenderingmime”value=“text/html”/>
    <capability name=“preferredrenderingtype”value=“html32”/>
    <capability name=“supportsxhtmlrendering”value=“false”/>