我的一个用户在打开文件时遇到一个错误(我正在使用标准的xml 1.0):
The remote name could not be resolved: 'www.w3.org'
我在StackOverflow中发现了一个处理此问题的帖子,它建议将XmlResolver属性设置为null。我试过这个,我的所有文件似乎仍然很好。但是,我想要的最后一件事是打破我的应用程序的文件读取机制,所以禁用解析器实际上是否安全?
答案 0 :(得分:3)
避免连接到W3C网站的另一种方法是使用XmlPreloadedResolver
。 XmlPreloadedResolver
包含许多嵌入的“众所周知的”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包含带有外部定义的实体的内嵌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,我没有使用其他版本的框架进行测试。