简单地说,我在将Stream对象传递给XMLReader对象的Create( Stream )函数时遇到了问题。
以下是我正在创建的应用程序中的一段代码,用于读取本地存储的加密和未加密 XML 文件。
Using fileStream As New FileStream(Filename, FileMode.Open, FileAccess.Read)
Dim reader As XmlReader = Nothing
Try
Dim encoder = GetEncoder()
Using cs As New CryptoStream(fileStream, encoder.CreateDecryptor(encoder.Key, encoder.IV), CryptoStreamMode.Read)
reader = XmlReader.Create(cs)
End Using
Catch ex As Exception
reader = XmlReader.Create(fileStream)
End Try
If reader IsNot Nothing Then
Try
Me.ReadXML(reader)
Finally
reader.Close()
reader = Nothing
End Try
End If
End Using
使用流时,在ReadXML函数中流的read方法的前几次迭代中出现以下异常。
- System.Xml.XmlException:有多个根元素。第 2 行,位置 26。在 System.Xml.XmlTextReaderImpl.Throw(String res, String arg) 在 System.Xml.XmlTextReaderImpl.ParseDocumentContent() 在 System.Xml.XmlTextReaderImpl 的 System.Xml.XmlTextReaderImpl.Throw(Exception e)。读()
- System.Xml.XmlException:根级别的数据无效。第 1 行,位置 1。在 System.Xml.XmlTextReaderImpl.Throw(String res, String arg) 在 System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace() 在 System.Xml.XmlTextReaderImpl 的 System.Xml.XmlTextReaderImpl.Throw(Exception e)。 ParseDocumentContent() 在 System.Xml.XmlTextReaderImpl.Read()
如果我只是将 XML 解密为纯文本并将其写入文件,我可以使用XMLTextReader并将解密文件的路径传递给构造函数来读取 XML 文件就好了。
我知道我的 XML 文件格式正确,因为XMLTextReader可以在仅传递文件路径时毫无问题地解析它。作为参考,这是我的 XML 文件的快照。
<?xml version="1.0"?>
<Books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="">
<Book name="Foo" author="Bar" />
<Book name="Bat" author="Widget" />
</Books>
我也知道ReadXML方法可以正常工作,原因与上述相同。
作为参考,我的ReadXML方法如下所示...
Sub ReadXML(reader As XmlReader)
Do While reader.Read()
Select Case reader.NodeType
Case XmlNodeType.Element
Select Case reader.Name.ToLower()
Case "x"
x=1
Case "y"
y=2
Case "z"
z=3
End Select
Case XmlNodeType.Text
x=a
y=b
z=c
Case XmlNodeType.EndElement
Select Case reader.Name.ToLower()
Case "a"
a=1
Case "b"
b=2
Case "c"
c=3
End Select
End Select
Loop
End Sub
谁能解释为什么用Stream对象创建XMLReader会给我这些异常?它与Stream开始读取的位置有关吗?
在此先感谢您的帮助!