2011-12-14 4 views
0

Эй я пытаюсь проверить мой HTML-страницу с официальным ОТД:XHTML ошибка +1,1 проверки: "Сущность параметра 'XHTML-inlstyle.mod' ссылки сам"

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); 
    } 
} 

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

Parameter entity 'xhtml-inlstyle.mod' references itself. Line 111, position 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 является неправильным:/Что делать?

+0

@DevNull Code означает, что это XHTML 1.1, который является модульным. – jasso

ответ

0

Решение для меня было загружено xhtml11.dtd и все файлы * .mod, на которые ссылается 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;]]> 

Теперь ОТД во время HTML страницы проверки можно использовать локальный ОТД без загрузки его из WWW;)

2

Ugh! 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. ]]> 

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

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

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

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

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

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

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

+0

Возможно, ошибка .NET 4.0: http://thejoyofcode.com/Validator_Module.aspx – mzjn

2

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

Выполнение этого способа, вы должны настроить свой собственный класс «MyUrlResolver» немного, чтобы вернуть «xhtml11-flat.dtd» вместо «xhtml11.dtd».

Смежные вопросы