[原文作者]:Doug Rothaus
[原文链接]:VB XML Cookbook, Recipe 5: The “Halloween” Problem (Doug Rothaus)
在前两次的手册中,我们讲了关于用ReplaceWith这个方法来进行身份转换.如果这个方法满足了你的需要,它会在你的代码中引发另外一个问题--"Halloween".让我们看看这个问题到底是怎样的,怎么样去解决.(详细的"Halloween"问题和解决方案可以参考这个文档).
"Halloween"描述的场景是,你有一个以某种方式更新的数据集同时这个数据集又在被遍历的话,你会得到一个空引用的异常,更坏的是,你的代码可能会因为修改错误的数据而崩溃.例如前面两个手册用到的代码段:
Private Sub Recipe5(ByVal xmlPath As String)
Dim xmlDoc = XDocument.Load(xmlPath)
Dim info = xmlDoc.<Contacts>.<Contact>.<aci:AdditionalContactInfo>
' Replace e-mail address tags with mailto links.
For Each email In info...<act:eMail>
TransformEmail(email)
Next
End Sub
Private Sub TransformEmail(ByVal email As XElement)
Dim emailHtml = <div class="Email">
<a href=<%= "mailto:" & email.<act:eMailAddress>.Value %>>
<%= email.<act:eMailAddress>.Value %>
</a> 
</div>
email.ReplaceWith(emailHtml)
End Sub
如果你运行这段代码,就会得到下面的异常:
这个异常的出现是因为For... Each循环正在循环用<eMail>元素查询出来的结果。在第一次调用TransformEmail这个方法的时候,<eMail>这个元素已经被HTML替换掉了,结果,这个查询引用的就是已经不存在的XML元素了。
要怎么解决这个问题呢?有几个解决方案,第一,你可能你已经注意到了在前面的手册中,把这个查询的结果用ToList方法返回一个List。像下面的代码
For Each email In info...<act:eMail>
改为:
For Each email In info...<act:eMail>.ToList()
返回一个List,表明要处理的就不再是一个查询结果,而更新就会作用到查询上面,例如用HTML替换XML,这样就不会影响到List。
其他比较普遍的解决方案就是你的代码不要修改原本的文件,把结果放到新的XML文件中。下一个手册我会讲怎么做。
打印 | 张贴于 2008-11-01 08:51:45 | Tag:VB Team Blog LINQ Cookbook Did you know?
留言反馈
北风网站http://www.ibeifeng.com/?u=32110
还包括好的学习论坛推荐,计算机,考研,大学课程发布,传智播客培训与咨询,王洋高端培训与咨询,咨路教育培训与咨询,J2SE基础教程 , J2EE学习区,J2ME学习区,尚学堂,传智,达内,其他机构,还包括MS-SQL数据库, 其他数据库,Oracle数据库,mysql数据,MFC组件使用, C++/VC++学习, C语言基础教程,编程开发工具,算法设计区,P网站制作,PHP网站制作,JSP网站制作,HTML/CSS/JS,黑客资源,网络基础,SEO学习,Sun认证,SCJP,软考,SCJD,微软认证,MCSE,思科认证,CCIE,MCSA,思科认证,CCNP ,CCNA,英语类视频,英语类视频资源, 韩语类,法语类视频,其他外语视频,JAVA类书籍,游戏开发类书籍,数据库类书籍,计算机网络类,操作系统,算法设计类书籍,各类源码模板下载,经济管理类书籍,2008欧洲杯