Xml 将布尔值转换为字符串的问题(部分时间有效,但并非全部)
谁能解释一下我哪里出了问题 为了解释标题的变化,在一个测试项目中测试这个问题时,我发现它有时会抛出,但并不总是(我知道这会使跟踪更加困难),在每种情况下,我都以同样的方式调用这个类,等等 注意:重新回答-我已将下面的答案标记为正确答案,因为它确实解决了问题,即使没有人能够解释为什么会出现此问题 为了便于解释,下面的第一个示例进行了简化,完整代码请向下滚动 我从xml中阅读如下内容:Xml 将布尔值转换为字符串的问题(部分时间有效,但并非全部),xml,vb.net,string,winforms,boolean,Xml,Vb.net,String,Winforms,Boolean,谁能解释一下我哪里出了问题 为了解释标题的变化,在一个测试项目中测试这个问题时,我发现它有时会抛出,但并不总是(我知道这会使跟踪更加困难),在每种情况下,我都以同样的方式调用这个类,等等 注意:重新回答-我已将下面的答案标记为正确答案,因为它确实解决了问题,即使没有人能够解释为什么会出现此问题 为了便于解释,下面的第一个示例进行了简化,完整代码请向下滚动 我从xml中阅读如下内容: Return XElement.Value Public Class MyXml Dim __Weekl
Return XElement.Value
Public Class MyXml
Dim __Weekly As New _Weekly
Public Property Weekly As _Weekly
Get
Return __Weekly
End Get
Set(value As _Weekly)
End Set
End Property
Public Class _Weekly
Property Flag As String
Get
Return Readxml("_Weekly", "_Flag")
End Get
Set(value As String)
SaveToXml("_Weekly", "_Flag", value)
End Set
End Property
End Class
Private Shared Function Readxml(xmlItem As String, xmlname As String)
Readxml = Nothing
Dim CCXml As XDocument
If My.Computer.FileSystem.FileExists(XMLPath) Then
CCXml = XDocument.Load(XMLPath)
Dim xEl As XElement = (From El In CCXml.Root.Elements() Where El.Name = xmlItem).FirstOrDefault
If Not IsNothing(xEl) Then
Dim ChxEl As XElement = (From El2 In xEl.Elements() Where El2.Name = xmlname).FirstOrDefault
If Not IsNothing(ChxEl) Then
Return ChxEl.Value
End If
End If
End Function
End Class
在这种情况下,.Value
为“真”或“假”
如果我获取返回值(此Q称为ReturnedString)并执行以下操作:
或
它有时会在If语句上引发异常从字符串“False”到类型“Long”的转换无效。
但是
如果我这样做:
Dim ReturnBol as Boolean = ReturnedString
If ReturnedBol then
'some code
End If
一直都很好
它仅在从xml读取时发生
xml是:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Root>
<_Weekly>
<_Flag>True</_Flag>
</_Weekly>
</Root>
因此,要返回字符串,请执行以下操作:
Dim myxml as New MyXml
If myxml.Weekly.Flag then
End If
请不要给我讲嵌套类和所有陷阱,我很清楚潜在的问题,但这正是我需要的(当然欢迎提出建议或建设性批评!)
CBool
是一个用于将表达式转换为布尔数据类型的函数。它的参数不能是字符串(除了“true”或“false”),这就是引发异常的原因
试一试
或
要获取字符串的相应布尔值,如
True
或False
,应使用:
就你而言:
If Boolean.Parse(ReturnedString) Then
'some code
End If
如果值不存在或者可以解析,请考虑使用BooLo.Pal.B/O.P>。这没有任何意义。请添加代码的相关部分,以便我们可以复制它并找到问题(必须在其他地方)。此外,DirectCast是否也会发生同样的情况?您可以尝试使用
返回字符串.Compare(XElement.value,“True”)
?@varocabas如果不确定您还需要什么,我可以输入生成返回字符串的完整函数,但这会使Q读起来相当笨拙!如果我直接投,同样的事情也会发生!你想干什么就干什么。但这种行为无法复制。如果我写If-CBool(“True”),那么一切都很好。因此,问题在于您的具体情况,最有可能出现在您的代码中(而不是在CBool中)。如果你想得到帮助,你应该允许帮助者得到你声称的错误。但是,正如我所说的,你想做什么就做什么;我在这里已经花了足够的时间。我现在将把提取代码添加到Q中,以防有帮助!为什么如果CBool(“False”)那么不会抛出异常?您可以将“True”直接强制转换为布尔值,但这对返回的字符串也不起作用!它不会抛出异常,因为“true”和“false”是异常接受的字符串。如果可能,请尝试If CBool(ReturnedString.ToString())然后)
-编辑我的回答异常接受的字符串?请您阅读原始帖子并理解问题(同时查看CBool MSDN信息)好吗?OP没有做CBool(“任何”)!,但CBool(“True”)是CBool或DirectCast(,Boolean)或执行Dim temp时发生的隐式cast的完全有效输入,为Boolean=“True”。请您更新您的答案并更正如此明显的错误,好吗?“它的参数不能是字符串”->你从哪里得到这样的想法?最好等到OP更新他的问题时,确切的问题可能会更清楚。是的,尝试CBool(“zzz”)
,你会发现这不是一个可接受的字符串-检查它是否接受。不管怎样,我不知道你为什么这么生气,我只是想帮这个人。即使我的答案不正确或不符合他的需要,你也可以试着帮助我改进我的答案,或者试着自己回答,也许帮助提问者的目标已经实现了。愤怒?!(我是我见过的最快乐的人之一)。你能重新阅读我的评论并理解为什么CBool(“zzz”)不符合我上面所说的吗?:)(>为了证明我很高兴)谢谢你的回答,我更新了这个问题,因为当我尝试@Chiapa建议时,我发现它有时很好,但并不总是如此,所以我现在真的想找出为什么不总是如此!我真的很好奇,如果出现异常,您的返回字符串会是什么样子。你有没有看过它?它看起来像“假”或“真”没有多少。然后可能有一个空格或一个控制字符在那里?在将其放入ParserTank以获取建议之前,请查看它的字节数,但由于它在某些情况下有效,但在其他情况下无效,我很有信心说,没有-我说过我总是尝试建议,所以我会尝试并让您知道。我认为这是不言而喻的。。。唯一的问题是,在我看来,无效字符串不应转换为False
,因为它不是False
,而是无效的…抱歉,我收回了:)我刚刚记得TryParse在out参数中生成结果。所以没有干扰。但在我看来,这仍然是一种误导,因为操作的成功很容易与实际结果相混淆。创建一个包装Boolean.TryParse的IsTrue共享方法是很简单的,如果您认为值得付出努力,它将消除这种混淆。
Dim myxml as New MyXml
If myxml.Weekly.Flag then
End If
If CBool(ReturnedString = "True") Then
'some code
End If
If CBool(ReturnedString.ToString()) Then
'some code
End If
If Boolean.Parse(ReturnedString) Then
'some code
End If