XmlDocument, XmlResolver и www.w3.org - PullRequest
1 голос
/ 24 марта 2009

У одного из моих пользователей была одна ошибка при открытии файла (я использую стандарт xml 1.0):

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

Я нашел здесь сообщение в StackOverflow , в котором говорится об этом и предлагается установить для свойства XmlResolver значение null. Я попробовал это, и все мои документы все еще загружаются нормально. Тем не менее, последнее, что я хочу, это сломать механизм чтения файлов моего приложения, так что это действительно безопасно отключить распознаватель?

Ответы [ 3 ]

3 голосов
/ 05 октября 2012

Другой способ избежать подключения к сайту W3C - использовать XmlPreloadedResolver. XmlPreloadedResolver содержит ряд «известных» DTD и (AFAIR) схем, и всякий раз, когда ваш xml содержит ссылку на одну из них, распознаватель будет обслуживать его, не пытаясь соединиться где-либо.

2 голосов
/ 05 октября 2012

У вас будут проблемы с отключением внешних ссылок, если анализируемый XML использует объекты, определенные в ссылочном DTD:

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

, где &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 анализируется правильно, но &text; является пустым, а не содержимым файла text.txt.

Оба случая довольно редки - особенно во втором, так что с вами все должно быть в порядке.

Проверка обычно не является проблемой: по умолчанию XmlReader не выполняет никакой проверки, поэтому даже если она не может загрузить соответствующий DTD / XSD, это не имеет значения.

Все это верно для .NET 4.0, я не тестировал другие версии фреймворка.

2 голосов
/ 24 марта 2009

Это действительно зависит от того, используете ли вы внешние ссылки. Вы всегда можете написать свой собственный XmlResolver, что позволит ему работать с файлами, которые у вас do (у меня есть файл, который читает известные файлы из resx, например).

Но самый простой вариант - просто отключить его ... и, конечно, ваши юнит-тесты быстро выявят любую проблему; -p

...