XmlDocument,XmlResolver和www.w3.org

时间:2009-03-24 11:09:23

标签: .net xml-serialization

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

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

我在StackOverflow中发现了一个处理此问题的帖子,它建议将XmlResolver属性设置为null。我试过这个,我的所有文件似乎仍然很好。但是,我想要的最后一件事是打破我的应用程序的文件读取机制,所以禁用解析器实际上是否安全?

3 个答案:

答案 0 :(得分:3)

避免连接到W3C网站的另一种方法是使用XmlPreloadedResolverXmlPreloadedResolver包含许多嵌入的“众所周知的”DTD和(AFAIR)模式,只要您的xml包含对其中一个的引用,解析器就会在不尝试连接的情况下为其提供服务。

答案 1 :(得分:2)

这实际上取决于您是否使用外部参考。您可以随时编写自己的XmlResolver,允许它使用您 所拥有的文件(我有一个从resx读取已知文件的文件)。

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

答案 2 :(得分:2)

如果要解析的XML使用在引用的DTD中定义的实体,则在禁用外部引用时会遇到问题:

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

其中&text;sample.dtd中定义。如果禁用外部引用,则无法使用错误Reference to undeclared entity 'text'

加载此XML

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

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

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

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

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

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