在.NET中解析XML布尔属性的最佳方法是什么?

21

声明为xs:boolean的XML属性可以接受"true"、"false"、"0"或"1"。然而,在.NET中,Boolean.Parse()仅接受"true"或"false"。如果它看到"0"或"1",它会抛出“Bad Format”异常。

那么,如何将这样的值解析为布尔值呢?

(不幸的是,我只能使用.NET 2.0解决方案,但如果v3.5提供了某些内容,我很乐意了解。)

4个回答

38

我认为XmlConvert拥有将常见的运行时类型和XML类型之间进行转换的全部方法。特别是XmlConvert.ToBoolean正好处理布尔值(有效字符串为"1"或"true"表示真,"0"或"false"表示假)。


太好了.. 正是我在寻找的(我就知道我应该花更多时间查阅 .Net Library 参考文档)。 - James Curran
要注意像True和False这样的值,因为XmlConvert视为无效的布尔值。你也不能简单地用ToLower()来解决这个问题,因为XmlConvert会对任何它不认识的值抛出异常。XmlConvert并不是万能的解决方案,但它是一个有趣的工具。 - Owen Ivory
@OwenIvory 像 True 和 False 这样的值根据 XML Schema 规范确实是无效的布尔值:http://www.w3.org/TR/xmlschema-2/#boolean。请参见此问题中的讨论:https://dev59.com/Q3M_5IYBdhLWcg3wmkYK。 - Panos

2
使用CBool替代Boolean.Parse应该可以解决问题:尽管你必须将它嵌入到一个try/catch块中(使用Boolean.TryParse不需要这样),但它可以成功转换大多数“合理”的布尔值,包括true/false和0/1。
编辑:正如评论中指出的那样,对于C#程序员来说,这个答案有点无用,因为CBool是VB-ism。它映射到Microsoft.VisualBasic.CompilerServices.Conversions::ToBoolean,不适合一般消费。这使得在被接受的答案中指出的XMLConvert类成为更好的选择。

1
我只看到VB6中定义了“CBool”,而在.NET中没有。可能VB.NET将其别名为某个Microsoft.VisualBasic.*方法,但我正在使用C#,因此需要知道调用的基础方法。 - James Curran

0

在尝试解析数据之前对其进行清理:

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

除了truefalse01之外的任何输入都会引发“格式错误”异常(这是应该的)。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接