What is the best way to parse an XML boolean attribute (in .NET)?
Asked Answered
T

4

19

An XML attribute declared as xs:boolean can acceptable be "true", "false", "0" or "1". However, in .NET, Boolean.Parse() will only accept "true" or "false". If it sees a "0" or "1", it throws a "Bad Format" exception.

So, given that, what's the best way to parse such a value into a Boolean?

(Unfortunately, I'm limited to .NET 2.0 solutions, but if v3.5 offers something, I'd love to hear about it.)

Tasker answered 5/11, 2008 at 15:11 Comment(0)
F
36

I think that XmlConvert has all the methods for converting between common language runtime types and XML types. Especially XmlConvert.ToBoolean handles exactly the boolean values (valid strings are "1" or "true" for true and "0" or "false" for false).

Frisbie answered 5/11, 2008 at 15:19 Comment(3)
Excellent.. Exactly what I was looking for (knew I should have spent more time poking through the .Net Library Reference)Tasker
Be wary of values like True and False, which XmlConvert views as invalid boolean values. You cannot simply fix this with a simple ToLower() either because XmlConvert throws an exception for any value it does not recognize. XmlConvert is not a silver bullet, but instead it is an interesting tool.Twoseater
@OwenIvory Values like True and False are indeed invalid boolean values according to XML Schema specification: w3.org/TR/xmlschema-2/#boolean. See also the discussion in this question: stackoverflow.com/questions/1308491Frisbie
L
2

Using CBool instead of Boolean.Parse should do the trick: although you'll have to embed it in a try/catch block (which wouldn't be required when using Boolean.TryParse), it will successfully convert most 'sensible' boolean values, including true/false and 0/1.

Edit: as pointed out in a comment, this answer is kinda useless for C# programmers, as CBool is a VB-ism. It maps to Microsoft.VisualBasic.CompilerServices.Conversions::ToBoolean, which is not suitable for general consumption. Which makes the XMLConvert class pointed out in the accepted answer an even better alternative.

Luwian answered 5/11, 2008 at 15:16 Comment(1)
I'm only seeing "CBool" defined for VB6, not for .NET. It's possible that VB.NET is aliasing it to some Microsoft.VisualBasic.* method, but I'm using C#, so I'd need to know that underlying method to call.Tasker
A
0

Sanitise the data before attempting to parse it:

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

Any other entry than true, false, 0 or 1 will still throw a "Bad Format" exception (as it should be).

Absently answered 5/11, 2008 at 15:27 Comment(0)
G
0
return value === 'true' || Number(value)
Gapin answered 9/4, 2013 at 11:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.