我编写了一个扩展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()
似乎也不起作用,因为它也传递了系统标识符。
答案 0 :(得分:1)
在当前实现中,不使用公共标识符 解析外部标识符。你的选择是使用异常作为catch,然后字符串验证公共id(但是,这个解决方案不优雅,而且很笨拙)。虽然,它会工作....
当然(这也需要您知道公共ID或字符串的至少一部分),以便您可以使用getEntity()。
我在网上搜索了一个可以识别出来的参考:
http://bytes.com/topic/net/answers/172597-xmlresolver-parameter-entity-problem
希望这有帮助。