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

时间:2010-04-08 13:35:48

标签: c# xml validation 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()似乎也不起作用,因为它也传递了系统标识符。

1 个答案:

答案 0 :(得分:1)

在当前实现中,不使用公共标识符 解析外部标识符。你的选择是使用异常作为catch,然后字符串验证公共id(但是,这个解决方案不优雅,而且很笨拙)。虽然,它会工作....

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

我在网上搜索了一个可以识别出来的参考:

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

希望这有帮助。