XmlDocument и формальный публичный идентификатор - PullRequest
1 голос
/ 23 января 2009

Почему моей функции GetEntity в моем перегруженном XmlResolver передается Формальный открытый идентификатор , когда я загружаю файл xml в XmlDocument? Это ошибка, или я должен как-то с этим справиться?

edit: Вот код.

Скажем, например, я делаю это:

XmlDocument myXmlDoc = new XmlDocument();
myXmlDoc.XmlResolver = new MyXmlResolver();
myXmlDoc.Load("myxmlfile.xml");

В MyXmlResolver У меня есть следующий код:

public override object GetEntity(Uri absUri, string role, Type typeToRet)
{
  if (typeToRet == null || typeToRet == typeof(Stream))
     return GetStream(absUri);
  else
     throw new XmlException("Unsupported class type: " + typeToRet);
}

Мне передают "file://path/to/xmldoc/-//W3C//DTD XHTML 1.1//EN", в absUri, что не имеет для меня никакого смысла. Должен ли я просто игнорировать это?

Ответы [ 3 ]

0 голосов
/ 23 января 2009

Я использую один для локального кэширования dtd, файлов мода и т. Д. (См. этот вопрос ). Моя проблема с тем, чтобы делать то, что он делает, состоит в том, что FPI, который он передает мне, на самом деле не является внешней ссылкой, и я не могу отличить его от реальной внешней ссылки.

0 голосов
/ 01 октября 2009

У меня та же проблема. Что я сделал, так это проверил переданное значение, и если оно было неверным, я вернул ему действительный uri для фиктивного DTD, который я создал. Просто вызов LoadXML работает, когда правильный dtd находится рядом с документом. Он знает, как видеть только DTD и игнорировать PUBLIC, который взрывает метод GetEntity. Я хочу DTD в местном обычном месте, так что мне не нужно, чтобы он жил с документами в разных местах. Поэтому я переопределяю GetEntity, даю ему общий путь, и затем я могу использовать один DTD для многих документов, которые живут по всей файловой системе.

0 голосов
/ 23 января 2009

Вам действительно нужен кастом XmlResolver? Что вы делаете в своем преобразователе, который требует пользовательской реализации?

Причина, по которой вам передается такой URI, заключается в том, что вы сказали XmlDocument, что вы явно разрешите все внешние ссылки в документе (например, DTD). Если вам не нужно делать это вручную, тогда вам следует использовать существующий тип XmlResolver или просто оставить его null и разрешить поведение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...