使用XMLReader和Stream对象读取XML

时间:2014-09-25 20:29:28

标签: xml vb.net filestream xmlreader cryptostream

简单地说,我将 Stream 对象传递给 XMLReader 对象的创建( Stream )<时出现问题/ b>功能。

以下是我创建的应用程序中的一段代码,用于读取本地存储的加密和未加密的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 方法的前几次迭代中得到以下例外。

  
      
  1. System.Xml.XmlException:有多个根元素。第2行,第26位。      在System.Xml.XmlTextReaderImpl.Throw(例外e)      在System.Xml.XmlTextReaderImpl.Throw(String res,String arg)      在System.Xml.XmlTextReaderImpl.ParseDocumentContent()      在System.Xml.XmlTextReaderImpl.Read()
  2.   
  3. System.Xml.XmlException:根级别的数据无效。第1行,第1位。      在System.Xml.XmlTextReaderImpl.Throw(例外e)      在System.Xml.XmlTextReaderImpl.Throw(String res,String arg)      在System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()      在System.Xml.XmlTextReaderImpl.ParseDocumentContent()      在System.Xml.XmlTextReaderImpl.Read()
  4.   

如果我只是将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 开始阅读的位置有关吗?

提前感谢您的帮助!

0 个答案:

没有答案