LINQ to XML игнорирует включения из DTD? - PullRequest
2 голосов
/ 22 марта 2011

Я использую MathML DTD для синтаксического анализа MathML, используя System.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(). Любая помощь приветствуется!

1 Ответ

6 голосов
/ 22 августа 2011

С здесь

Объекты в DTD по своей природе не защищены. Это возможно для вредоносный XML-документ, содержащий DTD для использования синтаксического анализатора вся память и процессорное время, вызывая атаку отказа в обслуживании. Поэтому в LINQ to XML обработка DTD по умолчанию отключена. Вы не должны принимать DTD из ненадежных источников.

Однако, чтобы включить его, вы должны использовать XDocumentType class .

Пара возможных решений:

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"));

Вся информация из того же источника

...