我创建了一个HTMLHelper
应该呈现解析的 XML 的自定义。该方法采用 XML 和XSL
文件路径,并应返回 HTML。
当我访问该页面时,我收到错误
XmlException:出于安全原因,此 XML 文档中禁止使用 DTD。要启用 DTD 处理,请将 XmlReaderSettings 上的 DtdProcessing 属性设置为 Parse 并将设置传递给 XmlReader.Create 方法。
正如您在下面的代码中看到的那样,我设置DtdProcessing
为(如异常所示),我认为这可以解决问题。经过仔细检查,异常发生在以下行:Parse
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 问题的公认答案似乎暗示了一个答案,但我无法弄清楚如何使用它。