0

簡単に言うと、StreamオブジェクトをXMLReaderオブジェクトのCreate( Stream )関数に渡すときに問題が発生しています。

以下は、ローカルに保存された暗号化された XML ファイルと暗号化されていない 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 の位置。読んだ()
  2. System.Xml.XmlException: ルート レベルのデータが無効です。行 1、位置 1。 System.Xml.XmlTextReaderImpl.Read() の ParseDocumentContent()

XML を平文に復号化してファイルとして書き込むだけであれば、XMLTextReaderを使用して、復号化されたファイルのパスをコンストラクターに渡して、XML ファイルを問題なく読み取ることができます。

XMLTextReaderは、ファイル パスのみを渡す場合に問題なく XML ファイルを解析できるため、XML ファイルが正しくフォーマットされていることはわかっています。参考までに、ここに私の 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を作成すると、これらの例外が発生する理由を誰か説明できますか? ストリームが読み取りを開始する場所と関係がありますか?

よろしくお願いします。

4

0 に答える 0