Почему Opera анализирует мою веб-страницу как XML? - PullRequest
7 голосов
/ 04 мая 2010

Я только что попытался просмотреть свой веб-сайт 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: : Пожалуйста, не оставляйте больше ответов, я нашел причину этого и задокументировал ниже.

Ответы [ 10 ]

13 голосов
/ 04 мая 2010

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

К счастью, с помощью XHTML поставщики браузеров решили исправить это и фактически отклонили недействительные документы. В вашем случае вы предоставляете документ в формате XHTML с типом application/xhtml+xml MIME:

# curl --head <a href="http://www.logmytime.de/" rel="noreferrer">http://www.logmytime.de/</a>
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. Все, чего вы достигли сейчас, - это то, что браузер отклонил ваш документ по двум причинам: он все еще недействителен, потому что вы не исправили фактическую ошибку и DOCTYPE и Тип MIME не совпадает.

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

7 голосов
/ 04 мая 2010

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

альтернативный текст http://img504.imageshack.us/img504/9243/logmytime.png

С Ограничение правильной формы: Уникальная спецификация спецификации :

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

5 голосов
/ 07 мая 2010

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

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

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

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

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

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

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

5 голосов
/ 05 мая 2010

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

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

1 голос
/ 04 мая 2010

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

0 голосов
/ 30 мая 2011

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

<способность name = "предпочитаемое значение RenderMime" = "text / html" />
значение =" html32 "/>

0 голосов
/ 12 ноября 2010

приложение / XHTML + XML

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

Текст / HTML

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

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

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

Content-Type: application / xhtml + xml; кодировка = UTF-8 или же Content-Type: text / html; кодировка = UTF-8

0 голосов
/ 07 мая 2010

Это потому что вы вроде как сказали ...

<html xmlns="http://www.w3.org/1999/xhtml">
0 голосов
/ 04 мая 2010

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

0 голосов
/ 04 мая 2010

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

...