2009-09-11 12 views
12

Tengo un objeto XDocument al que me gustaría añadir un tipo de documento XML. Por ejemplo:¿Cómo agrego un tipo de documento a un XDocument?

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

puedo crear una XDocumentType usando:

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

pero ¿cómo puedo aplicar eso a la XDocument existente?

Respuesta

14

Se puede añadir una XDocumentType a un XDocument existente, pero debe ser el primer elemento agregado. La documentación que lo rodea es vaga.

Gracias a Jeroen por señalar el enfoque conveniente de usar AddFirst en los comentarios. Este enfoque le permite escribir el código siguiente, que muestra cómo añadir el XDocumentType después de la XDocument ya tiene elementos:

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

Alternativamente, se puede utilizar el método Add añadir una XDocumentType a un XDocument existente, pero el La advertencia es que no debe existir ningún otro elemento, ya que tiene que ser el primero.

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

Por otro lado, el siguiente es inválido y se traduciría en una InvalidOperationException: "Esta operación crearía un documento estructurado de forma incorrecta."

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

¿Esto también se aplica para XDocument? El enlace de MSDN apunta a XmlDocument. – dtb

+1

@dtb: lo hace, pero no pude encontrarlo en MSDN para XDocument. También vea el código actualizado y InvalidOperationException. –

+1

Puede agregar un XDocumentType más tarde, pero debe asegurarse de que sea el primer elemento en 'XDocument'. Puede hacerlo utilizando 'xDocument.AddFirst (documentType)' en lugar de 'xDocument.Add (documentType)'. –

3

sólo tiene que pasar a la XDocument constructor (full example):

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

o utilizar XDocument.Add (el XDocumentType tiene que ser añadido antes de que el elemento raíz):

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