2009-09-11 11 views
12

J'ai un objet XDocument existant auquel j'aimerais ajouter un doctype XML. Par exemple:Comment ajouter un type de document à un XDocument?

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

je peux créer un XDocumentType en utilisant:

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

Mais comment puis-je l'appliquer à la XDocument existante?

Répondre

14

Vous pouvez ajouter un XDocumentType à un XDocument existant, mais il doit être le premier élément ajouté. La documentation entourant ceci est vague.

Merci à Jeroen pour avoir souligné l'approche pratique de l'utilisation de AddFirst dans les commentaires. Cette approche vous permet d'écrire le code suivant, qui montre comment ajouter le XDocumentType après la XDocument a déjà des éléments:

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

Alternativement, vous pouvez utiliser la méthode Add pour ajouter un XDocumentType à un XDocument existant, mais le caveat est qu'aucun autre élément ne devrait exister puisqu'il doit être le premier.

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

D'autre part, ce qui suit est invalide et entraînerait une InvalidOperationException: « Cette opération créerait un document mal structuré. »

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

Cela s'applique-t-il également à XDocument? Le lien MSDN pointe vers XmlDocument. – dtb

+1

@dtb: c'est le cas, mais je ne l'ai pas trouvé indiqué sur MSDN pour XDocument. Voir aussi le code mis à jour et InvalidOperationException. –

+1

Vous pouvez ajouter un XDocumentType plus tard, mais vous devez vous assurer qu'il s'agit du premier élément de 'XDocument'. Vous pouvez le faire en utilisant 'xDocument.AddFirst (documentType)' à la place de 'xDocument.Add (documentType)'. –

3

Il suffit de passer à la XDocument constructor (full example):

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

ou utilisez XDocument.Add (le XDocumentType doit être ajouté avant l'élément racine):

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