Domanda

Ho un oggetto XDocument esistente al quale vorrei aggiungere un doctype XML. Ad esempio:

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

Posso creare un XDocumentType usando:

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

Ma come posso applicarlo all'XDocument esistente?

È stato utile?

Soluzione

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

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

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

In alternativa, puoi usare il metodo Aggiungi per aggiungere un XDocumentType a un XDocument esistente, ma l'avvertenza è che nessun altro elemento dovrebbe esiste dal momento che deve essere il primo.

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

D'altra parte, quanto segue non è valido e si tradurrebbe in InvalidOperationException: " Questa operazione creerebbe un documento strutturato in modo errato. "

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

Altri suggerimenti

Passalo al XDocument costruttore ( esempio completo ):

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

o usa XDocument. Aggiungi ( XDocumentType deve essere aggiunto prima dell'elemento root):

XDocument doc = new XDocument();
doc.Add(new XDocumentType("a", "-//TEST//", "test.dtd", ""));
doc.Add(XElement.Parse("<a>test</a>"));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top