Как использовать пользовательский XmlResolver для разрешения общедоступных идентификаторов *внутри* DTD?

Я написал класс, расширяющий 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 Table Model 19990315//EN".

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


person James Sulak    schedule 08.04.2010    source источник
comment
Не могли бы вы добавить код в свой класс?   -  person Cine    schedule 18.04.2010


Ответы (1)


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

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

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

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

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

person Community    schedule 22.07.2010