1

XMLReader/XMLTextReaderクラスで本当に奇妙な問題があります。

私は単純なファイルロードを持っています:

public void First()
{
    XmlTextReader reader = new XmlTextReader(@"C:\MyXMLFile.xml");
    XmlReader readerToSerialize;
    XmlReader readerToLoad;
    DuplicateReaders(reader, out readerToSerialize, out readerToLoad);
    XmlSerializer serializer = new XmlSerializer(typeof(XMLTree));
    XmlFeed = (XMLDescriptor)serializer.Deserialize(readerToSerialize);
    xmlDoc.Load(readerToLoad);
}
protected void DuplicateReaders(XmlTextReader xmlReader, out XmlReader cloneOne, out readerToLoad)
{
    XmlDocument _XmlDocument = new XmlDocument();
    MemoryStream _Stream = new MemoryStream();
    _XmlDocument.Load((XmlTextReader)xmlReader);
    _XmlDocument.Save(_Stream);
    _Stream.Position = 0L;
    cloneOne = XmlReader.Create(_Stream);
    _Stream.Position = 0L;
    cloneTwo = XmlReader.Create(_Stream);
}

問題は、複製された要素の1つだけがファイル全体を正常に読み取り、次の要素(xmlDoc.Load)が常に同じ場所で失敗することです(このxmlファイルの行91、文字37)。xmlDocに直接割り当てる場合(つまり、元の要素を1回だけ複製し、関数から直接割り当てる場合):

public void First()
{
    XmlTextReader reader = new XmlTextReader(@"C:\MyXMLFile.xml");
    XmlReader readerToSerialize;
    DuplicateReaders(reader, out readerToSerialize);
    XmlSerializer serializer = new XmlSerializer(typeof(XMLTree));
    XmlFeed = (XMLDescriptor)serializer.Deserialize(readerToSerialize);
}
protected void DuplicateReaders(XmlTextReader xmlReader, out XmlReader cloneOne)
{
    XmlDocument _XmlDocument = new XmlDocument();
    MemoryStream _Stream = new MemoryStream();
    _XmlDocument.Load((XmlTextReader)xmlReader);
    _XmlDocument.Save(_Stream);
    _Stream.Position = 0L;
    cloneOne = XmlReader.Create(_Stream);
    _Stream.Position = 0L;
    this.xmlDoc.Load(_Stream);
}

それでも同じエラー91/37(予期しないEOF)が発生しますが、今回はシリアライザーで発生します。

私の最初の問題はxmlDoc.Load(reader)、リーダーインスタンスを使用すると破棄され、後でシリアル化できないことでした。MSDNフォーラムで複製機能を見つけましたが、それでもうまくいきません。私が達成したいことは非常に単純です:

1つのリーダーのみを使用して、1つのXmlDocumentと1つのシリアル化されたクラスを取得します。どれくらい難しいですか?

4

3 に答える 3

1

複製を使用する前に、最初のリーダーを閉じる必要があります。

reader.Close()
于 2012-07-19T16:58:42.043 に答える
1

cloneOne と cloneTwo の両方が同じ基になるメモリ ストリームを使用します。

別の MemoryStream を使用する

cloneTwo = XmlReader.Create(new MemoryStream(_Stream.ToArray()));
于 2012-07-19T18:00:27.907 に答える
0

2 つのリーダーを複製する代わりに、はるかに簡単な解決策を見つけました。XmlDoc から 2 つ目のリーダーを作成し、それを使用して逆シリアル化します。

于 2012-07-19T18:04:01.370 に答える