Почему Opera анализирует мою веб-страницу как XML?

Я только что попытался просмотреть свой веб-сайт http://www.logmytime.de/ в Opera (версия 10.50), это дает мне «ошибку при синтаксическом анализе xml» и отказывается отображать веб-страницу.

Я могу выбрать «Повторно обработать документ как HTML», и тогда страница будет работать нормально, но это вряд ли решение моей проблемы.

Странно то, что ошибка все еще возникает после установки типа документа HTML (вместо XTHML):

<!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, и его шаблоны никогда не действительный 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, даже если тип документа для страницы по-прежнему HTML.

Редактировать 2:. Чтобы сделать это еще яснее: я не спрашиваю, почему моя веб-страница недействительна XHTML. Я спрашиваю, почему Opera пытается разобрать его как XHTML, несмотря на тип документа HTML.

Edit3:: пожалуйста, не публикуйте больше ответов, я нашел причину этого и задокументировано ниже.


person Adrian Grigore    schedule 04.05.2010    source источник
comment
Что-то не так с вашей разметкой (т. Е. Теги не закрываются должным образом?) Я пытаюсь запустить его через валидатор w3, но он сейчас не загружается.   -  person quoo    schedule 04.05.2010
comment
Чтобы продемонстрировать это, я просто вставил образец шаблона на веб-страницу. - что именно и куда вставили?   -  person    schedule 04.05.2010
comment
Почему вы, возможно, захотите намеренно создать недействительные документы?   -  person    schedule 04.05.2010
comment
@ M28, но XHTML IS XML и, следовательно, любая ошибка синтаксического анализа должна заставить браузер лаять.   -  person CMircea    schedule 04.05.2010
comment
@ M28: Нет, но XHTML - это всегда XML.   -  person Adrian Grigore    schedule 04.05.2010
comment
Ваша веб-страница также не является действительным HTML, поэтому даже если вы выясните, как получить ее в формате HTML, это все равно не решит проблему. Проблема в том, что ваша веб-страница не работает. Решение - это исправить. Это действительно так просто. Фактически, вы, вероятно, могли бы исправить это десять раз, просто за то время, которое вы потратили на написание своих комментариев.   -  person Jörg W Mittag    schedule 04.05.2010
comment
Как именно вы предлагаете исправить шаблон html из моего редактирования выше? Возможно, вам захочется взглянуть на эту веб-страницу, чтобы понять, что такое механизм микротемплинга javascript: ejohn .org / blog / javascript-micro-templating   -  person Adrian Grigore    schedule 04.05.2010


Ответы (10)


Ваш документ не является действительным HTML-документом. Итак, браузер должен отклонить его. К сожалению, из-за исторической аварии большинство браузеров не отклоняют недействительные документы, а скорее пытаются исправить их (обычно с довольно дрянными результатами), так что authro даже не замечает, что его документ поврежден.

Thankfully, with XHTML, the browser vendors decided to fix that, and actually reject invalid documents. In your case, you are delivering your document as XHTML with the application/xhtml+xml MIME type:

# 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
So, the browser rejects your document (as it should). When you switch over to HTML, then it tries to fix your broken HTML.

Теперь вы изменили свой DOCTYPE на HTML 4.01, но все еще доставляете его как XHTML. Все, что вы сейчас достигли, это то, что у браузера есть две причины отклонить ваш документ: он все еще недействителен, потому что вы не исправили фактическую ошибку и DOCTYPE и Тип MIME не совпадает.

Вместо того, чтобы возиться с типами DOCTYPEs и MIME, чтобы заставить браузер проанализировать ваш сломанный документ, правильным способом решения этой проблемы было бы просто исправить недопустимую разметку и удалить посторонний атрибут class на строка 172. [Кстати: кто написал этот документ? Отступы и форматирование ужасно.]

person Jörg W Mittag    schedule 04.05.2010
comment
+1 за кражу моего ответа. Мне кажется, что документ автоматически сгенерирован, но это немного странно, учитывая, что ASP.NET MVC не генерирует код страницы за вас. Вероятно, он использует сторонние элементы управления или что-то, что автоматически генерирует HTML-код. - person CMircea; 04.05.2010
comment
-1: Извините, но вы не отвечаете на мой вопрос. Есть веская причина, по которой я хотел бы использовать код, отличный от xhtml. См. Мою правку выше. - person Adrian Grigore; 04.05.2010
comment
@ Адриан, он ответил на твой вопрос. Веб-служба сообщает браузеру, что ваша страница application/xhtml+xml, правильный тип документа для XHTML, что приводит к переходу в режим синтаксического анализа XML. Но вы ничего не говорите на странице, кроме документа, который игнорируется из-за типа MIME. Поскольку разметка вашей страницы ПОЛНОСТЬЮ РАЗРУШЕНА, браузер выдает ошибку синтаксического анализа XML. - person CMircea; 04.05.2010
comment
Этот журнал curl показывает, что ваш сервер отправляет страницу как XHTML - person AlfonsoML; 04.05.2010
comment
@ Адриан Григоре: Во-первых, если вы хотите использовать не-XHTML, то почему вы используете его как application/xhtml+xml? А во-вторых, это не имеет ничего общего с XHTML. В любом случае ваш документ недействителен HTML. Неважно, интерпретируете ли вы его как XHTML или HTML, потому что это не ни то, ни другое. - person Jörg W Mittag; 04.05.2010
comment
В этом случае я предполагаю, что мой вопрос: почему веб-сервер отправляет страницу как XHTML? - person Adrian Grigore; 04.05.2010
comment
Йорг: Я использую механизм микро-шаблонов javascript, поэтому моя страница никогда не может быть действительным XHTML, даже если я исправлю другие очевидные ошибки. См. Пример шаблона в моем edit1 выше. - person Adrian Grigore; 04.05.2010
comment
@ Адриан Григоре: Это может быть актуально: ответ stackoverflow.com/questions/2013224/ - person ; 04.05.2010
comment
@Andrian, ваш веб-сервер обслуживает его как XHTML, потому что именно так IIS настроен по умолчанию для работы с любой веб-страницей ASP.NET. - person CMircea; 04.05.2010
comment
Вы можете прочитать об этом на dev.opera.com. У Starbucks была такая же проблема. Разбойная библиотека. - person karlcow; 11.09.2011

Атрибут "class" указан дважды.

альтернативный текст

Из Ограничение корректности: Уникальная спецификация атрибута:

Имя атрибута НЕ ДОЛЖНО появляться более одного раза в одном и том же начальном теге или теге пустого элемента.

person Community    schedule 04.05.2010
comment
-1: Спасибо за ответ, но вы не отвечаете на мой вопрос. См. Мою правку выше. - person Adrian Grigore; 04.05.2010
comment
Относительно вашего вопроса: почему вы, возможно, захотите намеренно создать недействительные документы? Пожалуйста, посмотрите мою правку выше. - person Adrian Grigore; 04.05.2010
comment
@ Адриан Григоре: это действительно ответ на ваш вопрос. Все просто: спецификация запрещает браузерам отображать битые документы. Период. Если вы хотите, чтобы ваш документ отображался, исправьте его. Кроме того, вы пишете: я проверил исходный вывод в браузере, чтобы убедиться, я не сделал никаких ошибок. Ясно, что вы не очень внимательно проверяли, так как это вы пропустили. - person Jörg W Mittag; 04.05.2010

Вы получили правильный ответ (заголовок типа содержимого HTTP, требующий синтаксического анализа XML), и, похоже, он исправлен. Я просто добавлю небольшой намек на то, как вы можете выяснить, что не так, внутри самой Opera. Возможны два способа:

1) Информационная панель

Это не отображается по умолчанию, но если вы откроете панель панели слева (нажмите F4 для переключения, если вы ее не видите), а затем щелкните маленький знак плюса внизу, вы можете включить «Информация» в меню. .

Информационная панель показывает некоторую разнообразную информацию о текущей открытой странице, включая кодировку и тип MIME.

2) Опера Стрекоза

Нажмите Ctrl-Shift-I, чтобы открыть инструменты разработчика (или перейдите в меню Инструменты> Дополнительно> Opera Dragonfly).

Перейдите на вкладку «Сеть», затем перезагрузите сайт. Вы увидите запрос и сможете просмотреть заголовки. Сравнение этого с соответствующей информацией из Firebug показало бы вам разницу в заголовках Content-type. (Здесь вы также увидите, что Opera отправляет заголовок «Accept», содержащий «application / xhtml + xml». Это означает «Привет, сервер, если у вас есть этот файл в реальном формате XHTML, я бы это понял». Возможно, ваша серверная структура увидела этот заголовок и неверно ответила типом содержимого XHTML, даже если содержимое было недопустимым?)

person hallvors    schedule 07.05.2010
comment
Спасибо за информацию об инструментах разработчика и информационной панели. Это должно пригодиться для дальнейшей отладки. - person Adrian Grigore; 07.05.2010

Если у кого-то такая же проблема: как предлагает DeveloperArt, ее можно исправить с помощью простого атрибута ContentType = "text / html" в элементе страницы.

Изменить: проблема на самом деле была вызвана ошибкой с файлом mobile.Browser, который я использую в своем веб-проекте. Обходной путь, описанный выше, работает, но в моем случае в этом нет необходимости. См. этот ответ, чтобы получить более подробную информацию.

person Adrian Grigore    schedule 04.05.2010
comment
Я тоже работаю над документированием этого. Вы помните, какую версию MDBF вы использовали? - person Scott Hanselman; 20.08.2011
comment
@Scott Hanselman: Я не могу больше ничего сказать, так как несколько месяцев назад я удалил MDBF из своего проекта в пользу 51Degrees.mobi и переключил управление версиями на Mercurial. Однако я почти уверен, что скачал MDBF после августа прошлого года. - person Adrian Grigore; 22.08.2011

Похоже, что сервер обслуживает разные типы mime для разных пользовательских агентов. Firefox получает text / html, но Opera (и curl согласно Йоргу Миттагу) ​​получает application / xhtml + xml. У вас есть какой-либо код согласования содержания для вашего сайта?

person Alohci    schedule 04.05.2010
comment
У меня нет кода на моей веб-странице, который ищет тип браузера и возвращает разные типы контента в разные версии браузера. Или вы имеете в виду другое? - person Adrian Grigore; 04.05.2010
comment
stackoverflow.com/questions/2013224/ - person ; 04.05.2010

Попробуйте с другого ПК, чтобы убедиться, что у вас нет проблемы с кешем.

person Chris Thornton    schedule 04.05.2010
comment
Я пробовал это с другого компьютера, но проблема не исчезла. - person Adrian Grigore; 04.05.2010

Код страницы кешируется в вашем браузере, поэтому вы продолжаете видеть ошибку. Вы изначально видели ошибку, потому что ваш код, скорее всего, недействителен.

person Community    schedule 04.05.2010
comment
Я пробовал это с другого компьютера, но проблема не исчезла. - person Adrian Grigore; 04.05.2010

Это потому, что ты как бы сказал об этом ...

<html xmlns="http://www.w3.org/1999/xhtml">
person Fenton    schedule 07.05.2010
comment
Я тоже обдумывал это, но в данном случае это не актуально. Проблема действительно в том, что сервер отправляет контент типа application / xhtml + xml; для браузеров Opera по умолчанию и text / html почти для всех других браузеров. Я до сих пор не уверен, почему это так (я не кодировал что-либо, зависящее от браузера на стороне сервера), но, по крайней мере, теперь я знаю, как это переопределить. - person Adrian Grigore; 07.05.2010

приложение / xhtml + xml

Если сервер отправляет страницу как application / xhtml + xml, браузер анализирует ее как XML в соответствии с требованиями спецификации. При синтаксическом анализе как XML первая ошибка правильного формата XML остановит синтаксический анализ, и клиент (браузер) обычно отображает сообщение об ошибке.

текст / HTML

Парсеры для текста / html более терпимы (из-за истории разработки html).

Изменение типа пантомимы

Чтобы изменить тип содержимого, отправляемого сервером, необходимо переопределить значение заголовка HTTP: Content-Type. Это можно сделать с помощью языка сценариев на стороне сервера или иногда в конфигурации сервера, например, Apache. Я не знаю, как Microsoft-IIS / 7.5 может указывать на базе URI.

Тип содержимого: приложение / xhtml + xml; charset = utf-8 или Content-Type: text / html; charset = utf-8

person karlcow    schedule 12.11.2010

В основном это происходит с ASP.NET, поскольку он устанавливает тип содержимого для Opera как application / xhtml + xml. Чтобы решить эту проблему. Вам необходимо установить тип содержимого text / html. Лучший способ решить эту проблему - добавить следующий код в файл конфигурации .browser для Opera в файле App_Browser.

‹Имя возможности =" предпочтительныйRenderingMime "значение =" текст / html "/›
‹имя возможности =" предпочтительный типRenderingType "значение =" html32 "/›
‹имя возможности =" SupportsXhtmlRendering "значение =" ложь " / ›

person Community    schedule 30.05.2011