Исключение «DTD запрещено» при преобразовании файла XMLC#

Место общения программистов C#
Ответить
Anonymous
 Исключение «DTD запрещено» при преобразовании файла XML

Сообщение Anonymous »

Я создал собственный HTMLHelper, который должен отображать анализируемый XML. Метод принимает XML и путь к файлу XSL и должен возвращать HTML.

При доступе к странице я получаю сообщение об ошибке


XmlException: по соображениям безопасности DTD запрещен в этом XML-документе. Чтобы включить обработку DTD, установите для свойства DtdProcessing в XmlReaderSettings значение Parse и передайте настройки в метод XmlReader.Create.


Как вы можете видеть на рисунке мой код ниже, я устанавливаю DtdProcessing на в XmlReaderSettings (как следует из исключения), что, как я думал, решит проблему. При ближайшем рассмотрении исключение возникает на строке:

Код: Выделить всё

transformObj.Load(xsltPath);
Но я не понимаю, как передать XmlReaderSettings этому методу, чтобы установить свойство DtdProcessing. Единственные перегрузки XslCompiledTransform.Load, которые принимают объект настроек, ожидают объекта XsltSettings, у которого нет свойства DtdProcessing.

Полный метод выглядит следующим образом:

Код: Выделить всё

public static IHtmlContent RenderXml(this IHtmlHelper htmlHelper, string xml, string xsltPath)
{
XsltArgumentList args = new XsltArgumentList();
// Create XslCompiledTransform object to load and compile XSLT file.
XslCompiledTransform transformObj = new XslCompiledTransform();
transformObj.Load(xsltPath);

// Create XMLReaderSetting object to assign DtdProcessing, Validation type
XmlReaderSettings xmlSettings = new XmlReaderSettings();
xmlSettings.DtdProcessing = DtdProcessing.Parse;
xmlSettings.MaxCharactersFromEntities = 1024; // Prevent DoS attacks
xmlSettings.ValidationType = ValidationType.DTD;

// Create XMLReader object to Transform xml value with XSLT setting
XmlReader reader = XmlReader.Create(new StringReader(xml), xmlSettings);

using (reader)
{
StringWriter writer = new StringWriter();
transformObj.Transform(reader, args, writer);

// Generate HTML string from StringWriter
HtmlString htmlString = new HtmlString(writer.ToString());
return htmlString;
}
}
И, на мой взгляд, я использую:

Код: Выделить всё

@Html.RenderXml(ViewBag.XML as string, ViewBag.XSL as string);
Я ознакомился с советами, приведенными в ответах на этот вопрос, но, насколько я могу судить, я уже предпринял предложенные шаги. Принятый ответ на этот вопрос MSDN, кажется, намекает на ответ, но я не смог понять, как его использовать.

Подробнее здесь: https://stackoverflow.com/questions/608 ... g-xml-file
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»