【问题标题】:XmlDocument, XmlResolver and www.w3.orgXmlDocument、XmlResolver 和 www.w3.org
【发布时间】:2012-10-08 22:54:31
【问题描述】:

我的一个用户在打开文件时遇到了一个错误(我使用的是标准 xml 1.0):

The remote name could not be resolved: 'www.w3.org'

我在StackOverflow 找到了一篇处理此问题的帖子,它建议将 XmlResolver 属性设置为 null。我已经尝试过了,我所有的文档似乎仍然可以正常加载。但是,我最不想做的就是打破我的应用程序的文件读取机制,那么禁用解析器真的安全吗?

【问题讨论】:

    标签: .net xml-serialization


    【解决方案1】:

    另一种避免连接到 W3C 站点的方法是使用XmlPreloadedResolverXmlPreloadedResolver 包含许多“众所周知的”DTD 和嵌入的(AFAIR)模式,只要您的 xml 包含对其中之一的引用,解析器就会为其提供服务,而无需尝试连接任何地方。

    【讨论】:

      【解决方案2】:

      这实际上取决于您是否使用外部引用。您始终可以编写自己的XmlResolver,使其能够处理您拥有拥有的文件(例如,我有一个从 resx 读取已知文件的文件)。

      但最简单的选择就是禁用它...当然,您的单元测试会很快发现任何问题;-p

      【讨论】:

      • 谢谢马克。我认为我没有使用任何外部参考。不幸的是,我不是 xml 专家,所以我不相信自己会在发布新版本之前正确测试此更改。外部参考会是什么样子?如果没有 ext refs,为什么 XmlDocument 会连接到 w3?
      • 主要是xsd验证,大概?
      • @MarcGravell:可能的问题是实体解析 - 请参阅我添加的答案。
      【解决方案3】:

      如果正在解析的 XML 使用了在被引用的 DTD 中定义的实体,那么在禁用外部引用时将会遇到问题:

      <?xml version="1.0" encoding="utf-8"?>
      <!DOCTYPE sample SYSTEM "./sample.dtd">
      <root>&text;</root>
      

      其中&amp;text;sample.dtd 中定义。如果您禁用外部引用,此 XML 将无法加载并出现错误 Reference to undeclared entity 'text'

      另一种情况是,如果您的 XML 包含具有外部定义的实体的内联 DTD:

      <?xml version="1.0" encoding="utf-8"?>
      <!DOCTYPE dtd_sample[
        <!ENTITY text SYSTEM ".\text.txt">
      ]>
      <root>&text;</root>
      

      在这种情况下,XML 解析正确,但 &amp;text; 为空,而不是 text.txt 文件的内容。

      这两种情况都非常罕见 - 尤其是第二种情况,所以你应该没问题。

      验证通常不是问题:默认情况下XmlReader 不进行任何验证,因此即使它无法加载相关的 DTD/XSD 也没有任何区别。

      所有这些都适用于 .NET 4.0,我没有使用其他版本的框架进行测试。

      【讨论】:

        猜你喜欢
        • 2017-01-27
        • 1970-01-01
        • 1970-01-01
        • 2019-08-24
        • 2011-09-01
        • 2012-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多