2009-09-11 6 views
12

Ho un oggetto XDocument esistente a cui aggiungere un doctype XML. Per esempio:Come si aggiunge un tipo di documento a un XDocument?

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

posso creare un XDocumentType utilizzando:

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

Ma come faccio ad applicare che al XDocument esistente?

risposta

14

è possibile aggiungere un XDocumentType a uno esistente XDocument, ma deve essere il primo elemento aggiunto. La documentazione che circonda questo è vaga.

Grazie a Jeroen per aver sottolineato l'approccio pratico dell'utilizzo di AddFirst nei commenti. Questo approccio permette di scrivere il codice seguente, che mostra come aggiungere il XDocumentType dopo la XDocument ha già elementi:

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

In alternativa, è possibile utilizzare il metodo Add per aggiungere un XDocumentType a un XDocument esistente, ma la l'avvertenza è che nessun altro elemento dovrebbe esistere poiché deve essere il primo.

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

D'altra parte, il seguente è valido e si tradurrebbe in un InvalidOperationException: "Questa operazione potrebbe creare un documento in modo non corretto strutturato"

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

Questo vale anche per XDocument? Il collegamento MSDN punta a XmlDocument. – dtb

+1

@dtb: lo fa, ma non è stato possibile trovarlo indicato su MSDN per XDocument. Vedi anche il codice aggiornato e InvalidOperationException. –

+1

Puoi aggiungere un XDocumentType in seguito, ma devi assicurarti che sia il primo elemento in 'XDocument'. Puoi farlo usando 'xDocument.AddFirst (documentType)' invece off 'xDocument.Add (documentType)'. –

3

Basta passarlo al XDocument constructor (full example):

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

o utilizzare XDocument.Add (il XDocumentType deve essere aggiunto prima che l'elemento radice):

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