0

我创建了一个HTMLHelper应该呈现解析的 XML 的自定义。该方法采用 XML 和XSL文件路径,并应返回 HTML。

当我访问该页面时,我收到错误

XmlException:出于安全原因,此 XML 文档中禁止使用 DTD。要启用 DTD 处理,请将 XmlReaderSettings 上的 DtdProcessing 属性设置为 Parse 并将设置传递给 XmlReader.Create 方法。

正如您在下面的代码中看到的那样,我设置DtdProcessing为(如异常所示),我认为这可以解决问题。经过仔细检查,异常发生在以下行:ParseXmlReaderSettings

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 问题的公认答案似乎暗示了一个答案,但我无法弄清楚如何使用它。

4

1 回答 1

1

如果 XSLT 使用或引用 DTD,请将具有必要 XmlReaderSettings 的 XmlReader 传递给 Load 方法,即使用重载https://docs.microsoft.com/en-us/dotnet/api/system.xml.xsl.xslcompiledtransform .load?view=netframework-4.8#System_Xml_Xsl_XslCompiledTransform_Load_System_Xml_XmlReader_

using (XmlReader xsltReader = XmlReader.Create(xsltPath, new XmlReaderSettings() { DtdProcessing = DtdProcessing.Parse }))
{
  transformObj.Load(xsltReader);
}
于 2020-03-25T15:38:40.167 回答