2008-11-05 12 views
18

Un atributo XML declarado como xs: boolean puede ser aceptable como "verdadero", "falso", "0" o "1". Sin embargo, en .NET, Boolean.Parse() solo aceptará "verdadero" o "falso". Si ve un "0" o "1", arroja una excepción de "Formato incorrecto".¿Cuál es la mejor manera de analizar un atributo booleano XML (en .NET)?

Entonces, dado que, ¿cuál es la mejor manera de analizar ese valor en un booleano?

(Por desgracia, yo estoy limitado a .NET 2.0 soluciones, pero si v3.5 ofrece algo, me encantaría saberlo.)

Respuesta

35

Creo que XmlConvert tiene todos los métodos para convertir tipos de tiempo de ejecución de lenguaje común y tipos de XML. Especialmente XmlConvert.ToBoolean maneja exactamente los valores booleanos (las cadenas válidas son "1" o "verdadero" para verdadero y "0" o "falso" para falso).

+0

Excelente ... Exactamente lo que estaba buscando (sabía que debería haber pasado más tiempo revisando la .Net Library Reference) –

2

Usando CBool en lugar de Boolean.Parse debe hacer el truco: aunque tendrá que incrustarlo en un bloque try/catch (que no sería necesario al usar Boolean.TryParse), convertirá con éxito la mayoría de los valores booleanos 'sensibles', incluidos verdadero/falso y 0/1.

Editar: como se señala en un comentario, esta respuesta es un poco inútil para los programadores de C#, como CBool es un VB-ismo. Se asigna al Microsoft.VisualBasic.CompilerServices.Conversions::ToBoolean, que no es adecuado para el consumo general. Lo que hace que la clase XMLConvert señalada en la respuesta aceptada sea una alternativa aún mejor.

+0

Solo veo "CBool" definido para VB6, no para .NET. Es posible que VB.NET esté aliasing a algún método Microsoft.VisualBasic. *, Pero estoy usando C#, por lo que necesitaría saber cuál es el método subyacente para llamar. –

0

Esterilice los datos antes de intentar analizarlo:

string InnerText = yourXmlNode.InnerText;  
if (InnerText.Equals("0")) 
    InnerText = "false"; 
else if (InnerText.Equals("1")) 
    InnerText = "true"; 

Cualquier otra entrada de cierto, falsa, o habrá todavía una excepción de "Bad Format" (como se debería ser).

0
return value === 'true' || Number(value) 
Cuestiones relacionadas