Подтвердить что ты не робот

Как добавить тип документа в XDocument?

У меня есть существующий объект XDocument, к которому я хотел бы добавить doctype XML. Например:

XDocument doc = XDocument.Parse("<a>test</a>");

Я могу создать XDocumentType, используя:

XDocumentType doctype = new XDocumentType("a", "-//TEST//", "test.dtd", "");

Но как применить это к существующему XDocument?

4b9b3361

Ответ 1

Вы можете добавить XDocumentType в существующий XDocument, но это должен быть первый добавленный элемент. Документация, окружающая это, является неопределенной.

Благодаря Jeroen для указания удобного подхода использования AddFirst в комментариях. Этот подход позволяет вам написать следующий код, который показывает, как добавить XDocumentType после того, как XDocument уже имеет элементы:

var doc = XDocument.Parse("<a>test</a>");
var doctype = new XDocumentType("a", "-//TEST//", "test.dtd", "");
doc.AddFirst(doctype);

В качестве альтернативы вы можете использовать метод Add для добавления XDocumentType в существующий XDocument, но оговорка заключается в том, что ни один другой элемент не должен существовать, поскольку он должен быть первым.

XDocument xDocument = new XDocument();
XDocumentType documentType = new XDocumentType("Books", null, "Books.dtd", null);
xDocument.Add(documentType);

С другой стороны, следующее недопустимо и приведет к исключению InvalidOperationException: "Эта операция приведет к созданию неправильно структурированного документа".

xDocument.Add(new XElement("Books"));
xDocument.Add(documentType);  // invalid, element added before doctype

Ответ 2

Просто передайте его XDocument constructor (full пример):

XDocument doc = new XDocument(
    new XDocumentType("a", "-//TEST//", "test.dtd", ""),
    new XElement("a", "test")
);

или используйте XDocument.Add (перед корневым элементом должен быть добавлен XDocumentType):

XDocument doc = new XDocument();
doc.Add(new XDocumentType("a", "-//TEST//", "test.dtd", ""));
doc.Add(XElement.Parse("<a>test</a>"));