Ошибка проверки XHTML 1.1: «Сущность параметра« xhtml-inlstyle.mod »ссылается на себя» - PullRequest
0 голосов
/ 14 декабря 2011

Эй, я пытаюсь проверить свою HTML-страницу с официальным dtd:

MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(MessageBody));
ms.Position = 0;
XmlReaderSettings settingsReader = new XmlReaderSettings();
settingsReader.DtdProcessing = DtdProcessing.Parse;
settingsReader.ValidationType = ValidationType.DTD;
MyUrlResolver resolver = new MyUrlResolver();
settingsReader.XmlResolver = resolver;
 XmlReader reader = XmlReader.Create(ms, settingsReader);
 while(reader.Read()){}

и пользовательским XmlUrlResolver:

class MyUrlResolver : System.Xml.XmlUrlResolver
{
    public MyUrlResolver()
    { }

    public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
    {
        if (File.Exists(System.Web.Hosting.HostingEnvironment.MapPath("~/dtd/xhtml11.dtd")))
        {
            absoluteUri = new Uri(System.Web.Hosting.HostingEnvironment.MapPath("~/dtd/xhtml11.dtd"));
        }
        return base.GetEntity(absoluteUri, role, ofObjectToReturn);
    }

    public override Uri ResolveUri(Uri baseUri, string relativeUri)
    {
        baseUri = new Uri(System.Web.Hosting.HostingEnvironment.MapPath("~"));
        relativeUri = "dtd/xhtml11.dtd";
        return base.ResolveUri(baseUri, relativeUri);
    }
}

При чтении xml происходит проверка, и я получаю исключение:

Сущность параметра 'xhtml-inlstyle.mod' ссылается на себя.Строка 111, позиция 21.

Здесь происходит ошибка:

   <!-- Inline Style Module  ........................................ -->
<!ENTITY % xhtml-inlstyle.module "INCLUDE" >
<![%xhtml-inlstyle.module;[
<!ENTITY % xhtml-inlstyle.mod
     PUBLIC "-//W3C//ELEMENTS XHTML Inline Style 1.0//EN"
            "http://www.w3.org/MarkUp/DTD/xhtml-inlstyle-1.mod" >
%xhtml-inlstyle.mod;]]>

Я не могу понять, почему официальный dtd не прав: / Что мне делать?

Ответы [ 3 ]

2 голосов
/ 25 апреля 2016

Вы можете проверить по xhtml11-flat.dtd , который представляет собой совокупность xhtml11.dtd и всех файлов *. Mod , на которые ссылается xhtml11.dtd .

Делая это таким образом, вы должны немного настроить свой пользовательский класс MyUrlResolver, чтобы он возвращал xhtml11-flat.dtd вместо xhtml11.dtd.1011 *

2 голосов
/ 17 декабря 2011

Тьфу! DTD могут быть довольно сложными время от времени.

Давайте разберем ваш фрагмент DTD. Для ясности я перенес строки и добавил номера строк.

1.    <!ENTITY % xhtml-inlstyle.module "INCLUDE" >
2.    <![%xhtml-inlstyle.module;[
3.    <!ENTITY % xhtml-inlstyle.mod PUBLIC "-//W3C//ELEMENTS XHTML Inline Style 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-inlstyle-1.mod" >
4.    %xhtml-inlstyle.mod;]]>

В этой форме мы можем сказать, что в строках 1 есть 3 - объявления сущностей, в строках 2 и 4 - текст, содержащий ссылку на сущность.

Первая строка - это простая старая сущность литерального значения, и я добавлю текст замены вместо ссылки в строке 2. Чтобы добавить ясности, я опущу первую строку, добавлю несколько пробелов в качестве отступа и перевода строки , Тогда имеем:

2.    <![INCLUDE[
3.        <!ENTITY % xhtml-inlstyle.mod PUBLIC "-//W3C//ELEMENTS XHTML Inline Style 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-inlstyle-1.mod" >
4.        %xhtml-inlstyle.mod;
5.    ]]>

Строка 2 становится объявлением раздела разметки с ключевым словом INCLUDE. Содержимое раздела в строке 3 является объявлением объекта, для которого текст объекта является не литералом, а объявлением внешнего объекта из-за ключевого слова PUBLIC. Это означает, что заменяющий текст - это не следующий текст в кавычках, а содержимое ссылочного документа, местоположение которого определяется этим формальным общедоступным идентификатором и системным идентификатором (URL). Если вам повезет, и следование URL-адресу в конце строки не приведет к ошибке тайм-аута, вы увидите, что содержимое этого внешнего DTD представляет собой практически два объявления объекта параметра. Это: <!ENTITY % style.attrib "style CDATA #IMPLIED"> и <!ENTITY % Core.extra.attrib "%style.attrib;" >. Расширяя ссылку на сущность в строке 4, ваш оригинальный фрагмент DTD технически приводит к следующему фрагменту DTD:

<![INCLUDE[
    <!ENTITY % style.attrib "style CDATA #IMPLIED">
    <!ENTITY % Core.extra.attrib "%style.attrib;" >
]]>

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

Некоторые возможности, которые пришли мне в голову:

Правильный ли синтаксис, который вы обрабатываете, и тот же, что показан здесь? Если символ > отсутствует в конце второго объявления объекта, он не завершается до того, как ссылка на тот же объект (в строке 4). Работает ли синтаксический анализ объявления, только если оно написано в одной строке? Попробуйте перемотать его. Понимает ли парсер какие-либо другие объявления сущностей, кроме тех, которые имеют буквальное значение? Попробуйте создать аналогичное объявление сущности с открытым идентификатором, но сначала не обращайтесь к нему. Может ли проблема быть вызвана способом разрешения ваших (общедоступных / системных) идентификаторов? Есть ли у вас каталог DTD, перенаправляете ли вы возможные поиски DTD по сети в локальные копии, что произойдет, если вы измените URL-адрес на локальный файл (или место, которое вряд ли истекло) и т. Д. Является ли INCLUDE объявление вокруг объявления объекта, вызывающее его сбой? Попробуйте переместить его над объявлением INCLUDE, чтобы оно также значительно опережало ссылку на сущность. Работает ли INCLUDE вообще, попытка использования моего последнего фрагмента DTD также вызовет ошибку.

Кстати. DTD XHTML 1.1 содержит много других структур включения, похожих на эту, так что это, вероятно, не единственное место, которое вызовет ошибку. Это был только первый.

Я закончу этот пост плохими новостями. Если эта проблема не связана с какой-либо человеческой ошибкой, такой как неуместные или отсутствующие символы в вашем реальном файле DTD, или если это не способ извлечения внешних ресурсов DTD, то я бы предположил, что эта проблема вызвана ошибкой / неподдерживаемой функцией в вашем синтаксическом анализаторе (который, вероятно, не будет исправлен в ближайшее время) или затем (несмотря на ошибку, явно указывающую на файл DTD) это вызвано чем-то в вашем коде C # и по сравнению с другими людьми здесь я понятия не имею об этом и могу Я не могу тебе помочь. Приятной отладки в любом случае!

0 голосов
/ 19 декабря 2011

Решением для меня было скачать xhtml11.dtd и все файлы * .mod, относящиеся к dtd. Тогда я в dtd удаляю http ссылки на

    <!ENTITY % xhtml-datatypes.module "INCLUDE" >
<![%xhtml-datatypes.module;[
<!ENTITY % xhtml-datatypes.mod
     PUBLIC "-//W3C//ENTITIES XHTML Datatypes 1.0//EN"
            "xhtml-datatypes-1.mod" >
%xhtml-datatypes.mod;]]>

Теперь dtd во время проверки html-страницы может использовать локальную dtd без загрузки ее с www;)

...