3

我正在使用 MathML DTD 来解析 MathMLSystem.Xml.Linq.虽然普通的 MathML 东西被很好地识别,MMLEXTRA但 DTD 中的包含被忽略并且我得到错误。这是我正在使用的代码:

  if (!string.IsNullOrWhiteSpace(mathML))
  {
    try
    {
      const string preamble =
          "<!DOCTYPE mml:math PUBLIC \"-//W3C//DTD MathML 2.0//EN\"\n" +
           "\"http://www.w3.org/Math/DTD/mathml2/mathml2.dtd\" [\n" +
           "<!ENTITY % MATHML.prefixed \"INCLUDE\">\n" +
           "<!ENTITY % MATHML.prefix \"mml\"> \n" +
         "]>";
      var parsed = Parser.Parse(preamble + Environment.NewLine + mathML);
      textEditor.Text = printed;
      lblStatus.Caption = "MathML successfully translated.";
    } 
    catch (Exception e)
    {
      lblStatus.Caption = "Cannot translate text. " + e.Message;
    }
  }

解析器只是这样做XDocument.Load()。任何帮助表示赞赏!

4

1 回答 1

6

这里

DTD 中的实体本质上是不安全的。包含 DTD 的恶意 XML 文档可能会导致解析器使用所有内存和 CPU 时间,从而导致拒绝服务攻击。因此,在 LINQ to XML 中,DTD 处理默认是关闭的。您不应接受来自不受信任来源的 DTD。

但是,要启用它,您应该使用XDocumentType 类

几个可能的解决方案:

XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;

XmlReader reader = XmlReader.Create(Server.MapPath("filename"), settings);

XDocument doc = XDocument.Load(reader);

或者可能:

 XDocument xDocument = new XDocument(new XDocumentType("Books",null,"Books.dtd", null),new XElement("Book"));

所有信息都来自同一来源

于 2011-08-22T17:44:45.553 回答