C # XmlDocument.CreateDocumentType - PullRequest
2 голосов
/ 16 июня 2010

Я пытаюсь понять, что CreateDocumentType () работает в C #, и хотя я уже нашел и прочитал на нем страницу msdn, я не могу заставить ее работать на меня.

Я просто пытаюсь создать эту строку в моем XML-документе:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

Может ли кто-нибудь помочь мне с синтаксисом, необходимым для этого

РЕДАКТИРОВАТЬ: код пока что htmldoc является xmldocument, объявленным далее в коде.

string dtdLink = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";
string dtdDef = "-//W3C//DTD XHTML 1.0 Transitional//EN";

XmlDocumentType docType = htmlDoc.CreateDocumentType("html", "PUBLIC", dtdLink, dtdDef);
htmlDoc.AppendChild(docType);

Это НЕ работает.

Ответы [ 2 ]

9 голосов
/ 07 апреля 2011

Приветствия,

Сначала давайте рассмотрим простой пример:

        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.

0 голосов
/ 16 июня 2010

Не уверен, что вы уже пробовали, но существующий пример на странице msdn метода (CreateDocumentType, затем AppendChild к документу), кажется, работает нормально, просто передавая параметры "html", "- // W3C / / DTD XHTML 1.0 Transitional // EN "и" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", чтобы получить упомянутый вами тип документа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...