Question

Je souhaite ajouter un doctype XML à un objet XDocument existant. Par exemple:

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 appliquer cela au XDocument existant?

Était-ce utile?

La solution

Vous pouvez ajouter un XDocumentType à un XDocument existant, mais il doit s'agir du premier élément ajouté. La documentation qui l’entoure est vague.

Merci à Jeroen d'avoir signalé l'approche pratique consistant à utiliser AddFirst dans les commentaires. Cette approche vous permet d'écrire le code suivant, qui montre comment ajouter le XDocumentType après que le XDocument comporte déjà des éléments:

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

Vous pouvez également utiliser la méthode Add pour ajouter un XDocumentType à un XDocument existant, à ceci près qu'aucun autre élément ne doit existe car il doit être le premier.

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

Par contre, ce qui suit est invalide et entraînerait une exception InvalidOperationException: "Cette opération créerait un document structuré de manière incorrecte."

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

Autres conseils

Transmettez-le simplement au XDocument constructeur ( exemple complet ):

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

ou utilisez XDocument. Ajoutez (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>"));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top