XmlDocument.Load重载错误:如何从XML字符串提取属性值?
解决XmlDocument.Load(StringReader)时的非法路径字符错误
你遇到的问题很典型——VB.NET的重载解析在这里闹了个小乌龙,明明你传的是StringReader实例,却错误地匹配了接受文件路径字符串的Load(String)重载,导致它把你的XML字符串当成文件路径来解析,自然就抛出"路径中存在非法字符"的错误了。
最简单的修复方案:直接使用LoadXml方法
既然你已经有完整的XML字符串,完全不需要通过StringReader绕弯子,XmlDocument专门提供了LoadXml方法来直接加载XML字符串,彻底避免重载混淆的问题:
Dim Result As String Dim ID As String Dim doc As New Xml.XmlDocument() ' 直接加载XML字符串,无需StringReader doc.LoadXml(XMLString) ' 直接获取SerRes节点并读取属性 Dim serResNode As Xml.XmlNode = doc.SelectSingleNode("SerRes") If serResNode IsNot Nothing Then ID = serResNode.Attributes("RequestID").Value Result = serResNode.Attributes("OverallResult").Value End If
为什么原来的代码会出错?
理论上doc.Load(sr)应该匹配接受TextReader的重载,但VB.NET的重载解析有时会因为隐式转换、变量类型歧义等问题出现意外。比如如果你的XMLString变量类型不是严格的String(比如是Object类型),可能会导致解析器误判。而LoadXml方法是专门为字符串XML设计的,不存在重载冲突的可能。
如果你坚持要用StringReader的修复方式
如果你一定要保留StringReader的写法,可以显式指定重载,确保StringReader的类型被正确识别:
Dim sr As New System.IO.StringReader(XMLString) Dim doc As New Xml.XmlDocument() ' 显式调用接受TextReader的重载 DirectCast(doc, Xml.XmlDocument).Load(CType(sr, System.IO.TextReader))
不过这种写法完全没必要,还是用LoadXml更简洁直观。
内容的提问来源于stack exchange,提问作者Thomas Dutoit
相关产品推荐
相关产品推荐

