10

我有一个MemoryStreamStream类型参数传递的对象
Stream在 C# 中是抽象类)。

我想克隆他并MemoryStream在原件当前位置的一侧创建另一个对象,并从中创建一个新对象XMLReader,这样我就可以读取它的内容。

这就是我所做的,但它不起作用(调试标有//* ->的行newReader{None}值)
假设:你在一个方法中并且有Stream currentStream参考。

var x = new XmlReaderSettings();
x.IgnoreWhitespace = true;  

 using (var newMemoryStream = new MemoryStream())
 {
         stream.CopyTo(newMemoryStream);

         using (var newReader = XmlReader.Create(newMemoryStream,x)) //*
         {

           Doing some stuff...

         }
 }
4

3 回答 3

10

确保像这样重置位置newMemoryStream

newMemoryStream.Position = 0;

在创建之后stream.CopyTo(newMemoryStream);但之前XmlReader

所以整个事情应该是这样的:

var x = new XmlReaderSettings();
x.IgnoreWhitespace = true;  

using (var newMemoryStream = new MemoryStream())
{
    stream.CopyTo(newMemoryStream);
    newMemoryStream.Position = 0;

    using (var newReader = XmlReader.Create(newMemoryStream,x)) //*
    {
        Doing some stuff...
    }
}

此外,由于您在输入此方法之前在原始流上使用了另一个阅读器,因此请确保Position源流的 真正位于您想要的位置。

于 2012-12-19T22:08:51.483 回答
5

我已经解决了我的问题!:)
缺少的东西标有//*。这是应该的代码:

var xmlReaderSettings = new XmlReaderSettings();

stream.Position = 0;//*
xmlReaderSettings.IgnoreWhitespace = true;
using (var newMemoryStream = new MemoryStream())
{
    stream.CopyTo(newMemoryStream);
    newMemoryStream.Position = 0;  //*
    using (var newReader = XmlReader.Create(newMemoryStream, xmlReaderSettings))
    {
        newReader.MoveToContent(); //*

        Doing some stuff...
    }
}
于 2012-12-20T11:11:24.610 回答
3

您可以使用以下扩展方法克隆 a MemoryStream,包括其当前位置,并确保MemoryStream克隆后将原始位置重置为其原始位置:

public static MemoryStream Clone(this MemoryStream ms) {
    var pos = ms.Position;
    var ms2 = new MemoryStream();
    ms.CopyTo(ms2);
    ms.Position = pos;
    ms2.Position = pos;
    return ms2;
}
于 2015-05-05T14:07:14.347 回答