Как использовать пользовательский XmlResolver для разрешения открытых идентификаторов * внутри * DTD? - PullRequest
5 голосов
/ 08 апреля 2010

Я написал класс, расширяющий XmlUrlResolver для разрешения ссылок на публичные идентификаторы в документах XML. Например, когда документ XML начинается с:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE chapter PUBLIC "-//Custom//EN" "custom.dtd">

Открытый идентификатор "- // Custom / EN" передается параметру relativeURI моего переопределенного метода ResolveUri() и разрешается в фактическое местоположение DTD на диске. Это работает правильно.

Проблема возникает, когда внутри самого DTD есть ссылка на сущность. Например:

<!ENTITY % tablemodel
  PUBLIC "-//OASIS//DTD XML Exchange Table Model 19990315//EN"
  "soextblx.dtd">

В этом случае системный идентификатор "soextblx.dtd" передается в ResolveUri() вместо открытого идентификатора "- // OASIS // Модель таблицы DTD XML Exchange 19990315 // EN".

Есть ли способ сделать это? Переопределение GetEntity() также не работает, поскольку ему также передается системный идентификатор.

1 Ответ

1 голос
/ 22 июля 2010

В текущей реализации открытый идентификатор не используется, когда разрешение внешнего идентификатора. Ваш вариант - использовать исключение в качестве перехвата, а затем строку проверять общедоступный идентификатор (однако, это решение не элегантно и неудобно). Хотя, это бы сработало ....

Конечно (для этого также необходимо знать общедоступный идентификатор или хотя бы часть строки), чтобы вы могли использовать getEntity ().

Я искал в Интернете ссылку, которая идентифицирует это:

http://bytes.com/topic/net/answers/172597-xmlresolver-parameter-entity-problem

Надеюсь, это поможет.

...