2009-09-17 20 views
17

Esto funciona bien:excepción inesperada de XDocument constructor

XDocument xdoc = new XDocument(
    new XDeclaration("1.1", "UTF-8", "yes"), 
    new XProcessingInstruction("foo", "bar"), 
    new XElement("test")); 

Sin embargo, si lo cambio a pasar la "matriz params" explícitamente como una matriz:

object[] content = new object[] { 
    new XDeclaration("1.1", "UTF-8", "yes"), 
    new XProcessingInstruction("foo", "bar"), 
    new XElement("test") 
}; 
xdoc = new XDocument(content); 

falla con:

System.ArgumentException: no se pueden agregar caracteres de espacio en blanco al contenido.

¿No son estos dos ejemplos exactamente equivalentes? ¿Que está pasando aqui?

Respuesta

14

Cuando utiliza el primer método, está utilizando la sobrecarga de XDocument que primero toma una XDeclaration y luego un params para el contenido. Sin embargo, cuando utilizas el segundo enfoque, estás usando la sobrecarga, que tiene un parámetro para el contenido. La XDeclaración en tu matriz de objetos [] está llegando como contenido, y ahí es donde explota.

Ver aquí: http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.xdocument.aspx

+0

veo; No me di cuenta de que estaba llamando diferentes sobrecargas. Parece un poco desafortunado que el 'XDocument (objeto [])' acepte todo tipo de objetos, pero por alguna razón excluye XDeclaration. –

+0

Me pregunto si los diseñadores de idiomas cambiarían la implementación de argumentos 'params' ahora si se les diese la oportunidad. Esta es una trampa no obvia que se evitaría si se pudiera indicar explícitamente que está pasando varargs al sitio de llamadas de alguna manera. –

21

, usted puede obtener este error al analizar cadenas XML si utiliza el constructor XDocument en lugar de un método de fábrica.

Dado:

var xmlString = "<some-xml />"; 

esto falla:

var doc = new XDocument(xmlString); 

Esto funciona:

var doc = XDocument.Parse(xmlString); 
+0

Esto fue EXACTAMENTE el problema que estaba teniendo. Gracias Drew! –

Cuestiones relacionadas