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

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

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

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

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

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

2 ответа

Решение

Вы можете добавить 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

Просто передайте это XDocument конструктор ( полный пример):

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>"));
Другие вопросы по тегам