Приветствия,
Сначала давайте рассмотрим простой пример:
XmlDocument document = new XmlDocument();
XmlDocumentType doctype = document.CreateDocumentType("html", "-//W3C//DTD HTML 4.01//EN", "http://www.w3.org/TR/html4/strict.dtd", null);
document.AppendChild(doctype);
Если вы запустите этот код в IDE разработчика (Visual Studio, MonoDevelop, SharpDevelop), вы, вероятно, получите исключение DirectoryNotFoundExceptionссылаясь на - // W3C // DTD HTML 4.01 // EN в базовом каталоге вашего AppDomain.Если вы продолжите выполнение этого кода и подождете, пока загрузится dtd, вы, вероятно, получите исключение XmlException с сообщением: '-' - неожиданный токен.Ожидаемый токен ->.Строка 81, позиция 5. Вы можете продолжить выполнение этого кода, и XML-документ будет выведен, как и ожидалось.
Вы можете заключить этот код в блок try catch и подождать, пока он тихо сгенерирует ранее упомянутые исключения, и продолжить работу с этим документом, либо вы можете установить для свойства XmlResolver значение null, и документ не будет пытатьсяразрешить тип документа.
Для решения исходного вопроса:
Параметры в вызове CreateDocumentType не верны.Вам не нужно указывать PUBLIC, а dtdLink и dtdDef следует поменять местами.Вот ревизия к исходной публикации, в которой создается правильный тип узла документа.
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string dtdLink = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";
string dtdDef = "-//W3C//DTD XHTML 1.0 Transitional//EN";
// Create an xml document
XmlDocument htmlDoc = new XmlDocument();
/// Set the XmlResolver property to null to prevent the docType below from throwing exceptions
htmlDoc.XmlResolver = null;
try
{
// Create the doc type and append it to this document.
XmlDocumentType docType = htmlDoc.CreateDocumentType("html", dtdDef, dtdLink, null);
htmlDoc.AppendChild(docType);
// Write the root node in the xhtml namespace.
using (XmlWriter writer = htmlDoc.CreateNavigator().AppendChild())
{
writer.WriteStartElement("html", "http://www.w3.org/1999/xhtml");
// Continue the document if you'd like.
writer.WriteEndElement();
}
}
catch { }
// Display the document on the console out
htmlDoc.Save(Console.Out);
Console.WriteLine();
Console.WriteLine("Press Any Key to exit");
Console.ReadKey();
}
}
}
Обратите внимание, что этот код работает в MS Windows и Linux с Mono Good luck.