Чтение XML с использованием объектов XMLReader и Stream

Проще говоря, у меня возникла проблема при передаче объектов Stream в функцию Create (Stream) объекта XMLReader.

Ниже приведен фрагмент кода из приложения, которое я создаю для чтения зашифрованных и незашифрованных 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.

  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.XImpext. Читать()
  2. System.Xml.XmlException: данные на корневом уровне недействительны. Строка 1, позиция 1. в System.Xml.XmlTextReaderImpl.Throw(исключение e) в System.Xml.XmlTextReaderImpl.Throw(String res, String arg) в System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace() в System.Xl.XML.XML 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

Может кто-нибудь объяснить, почему создание XMLReader с объектами Stream дало бы мне эти исключения? Это как-то связано с тем, где начинает читать поток?

Заранее спасибо за помощь!

0 ответов

Другие вопросы по тегам