【问题标题】:How do I use a custom XmlResolver to resolve public identifiers *inside* a DTD?如何使用自定义 XmlResolver 来解析 *inside* DTD 的公共标识符?
【发布时间】:2011-02-05 17:07:22
【问题描述】:

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

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

公共标识符“-//Custom/EN”被传递给我覆盖的ResolveUri() 方法的relativeURI 参数,并解析为磁盘上的实际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() 似乎也不起作用,因为它还传递了系统标识符。

【问题讨论】:

  • 你能在你的课堂上添加代码吗?

标签: c# xml validation dtd


【解决方案1】:

在当前的实现中,公共标识符在以下情况下不使用 解析外部标识符。您的选择是将异常用作捕获,然后对公共 ID 进行字符串验证(但是,此解决方案并不优雅而且很笨拙)。不过,它会工作....

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

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

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2021-09-13
    • 2014-09-18
    • 2021-01-11
    相关资源
    最近更新 更多