如何使用自定义XmlResolver来解析*DTD中的公共标识符*?

Jam*_*lak 5 c# xml validation dtd

我编写了一个扩展XmlUrlResolver的类来解析XML文档中对公共标识符的引用.例如,当XML文档以以下内容开头时:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE chapter PUBLIC "-//Custom//EN" "custom.dtd">
Run Code Online (Sandbox Code Playgroud)

公共标识符" - // Custom/EN"将传递给relativeURI我的override ResolveUri()方法的参数,并解析为磁盘上的实际DTD位置.这工作正常.

当DTD本身内存在实体引用时,会出现此问题.例如:

<!ENTITY % tablemodel
  PUBLIC "-//OASIS//DTD XML Exchange Table Model 19990315//EN"
  "soextblx.dtd">
Run Code Online (Sandbox Code Playgroud)

在这种情况下,系统标识符"soextblx.dtd"被传递给ResolveUri()公共标识符" - // OASIS // DTD XML Exchange Table Model 19990315 // EN".

有没有办法实现这个目标?覆盖GetEntity()似乎也不起作用,因为它也传递了系统标识符.

小智 1

在当前实现中,解析外部标识符时不使用公共标识符。您的选择是使用异常作为捕获,然后通过字符串验证公共 id(但是,此解决方案并不优雅且笨拙)。虽然,它会起作用......

当然(这还要求您知道公共 ID 或至少字符串的一部分),以便您可以使用 getEntity()。

我在网上搜索了一个参考资料来确定这一点:

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

希望这会有所帮助。