Как добавить тип документа в XDocument? - PullRequest
13 голосов
/ 12 сентября 2009

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

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

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

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

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

Ответы [ 2 ]

15 голосов
/ 12 сентября 2009

Вы можете добавить 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
3 голосов
/ 12 сентября 2009

Просто передайте его конструктору 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>"));
...