Чтение 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.
- 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. Читать()
- 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 дало бы мне эти исключения? Это как-то связано с тем, где начинает читать поток?
Заранее спасибо за помощь!