2009-09-11 2 views
12

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

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

я могу создать XDocumentType с помощью:

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

Но как я могу подать заявление, что к существующему XDocument?

ответ

14

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

Это также относится к XDocument? Ссылка MSDN указывает на XmlDocument. – dtb

+1

@dtb: это так, но я не мог найти его в MSDN для XDocument. Также см. Обновленный код и InvalidOperationException. –

+1

Вы можете добавить XDocumentType позже, но вы должны убедиться, что это первый элемент в 'XDocument'. Вы можете сделать это, используя 'xDocument.AddFirst (documentType)' вместо 'xDocument.Add (documentType) '. –

3

Просто передать его XDocument constructor (full example):

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>"));