从XmlReader获取流

Ste*_*and 7 .net c#

作为一个库存过程的结果,我收到一个SqlXml对象,我可以从中调用CreateReader以获得标准,XmlReader以便我可以在我的dll中处理它.

在应用程序的业务层中,我有一个XMySerializer可以读取xml并实例化业务对象的.

但是,该XMySerializer.Deserialize函数将System.IO.Stream作为输入.

所以,问题是我怎么能得到System.IO.Stream 从一个System.Xml.XmlReader?反向会更容易......

Tas*_*ask 8

实际上,你可以.
它只需要一些并非每个人都使用的库,因为它们是BizTalk的一部分.
如果您有权访问BizTalk运行时,则可以使用XmlTranslatorStream从XmlReader实例提供Stream实例:

var xmlStream = new XmlTranslatorStream(xmlReader);
Run Code Online (Sandbox Code Playgroud)

您可以使用3个构造函数.

是的,从XmlReader获取Stream的非常大的要求,所以你可以看到为什么大多数答案等同于"你不能从这里到达那里!"

希望有所帮助,
周杰伦


Dan*_*eld 5

该XmlReader可能会或可能不会被备份Stream。我欺骗了一些使用反射的方法来尝试获取XmlReader Stream或TextWriter支持XmlReader,但最后我认为将对象写入新流可能是最简单的方法。我建议在接受的答案上使用此方法,因为接受的答案在大型文档上效果不佳,并且这基本上是杰伊答案中BizTalk版本的简化版本(BizTalk会自动检测它是否应该使用FileStreamor MemoryStream,并对XML进行其他一些特殊处理):

public static class XmlExtensions
{
    public static MemoryStream ToStream(this XmlReader reader)
    {
        MemoryStream ms = new MemoryStream();
        reader.CopyTo(ms);
        return ms;
    }

    public static FileStream ToStream(this XmlReader reader, string fileName)
    {
        FileStream fs = new FileStream(fileName, FileMode.Create);
        reader.CopyTo(fs);
        return fs;
    }

    public static void CopyTo(this XmlReader reader, Stream s)
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.CheckCharacters = false; // don't get hung up on technically invalid XML characters
        settings.CloseOutput = false; // leave the stream open
        using (XmlWriter writer = XmlWriter.Create(s, settings))
        {
            writer.WriteNode(reader, true);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

CopyTo允许您随意设置流;ToStream为您提供了两种有用的常见情况,在这些情况下,您只想快速获取常规MemoryStream文件(用于较小的XML文件)或使用常规文件FileStream(用于较大的XML文件)。

当然,最后,如果您确实是为了序列化而这样做,则最好在序列化类中添加一个重载,如:

XMySerializer.Deserialize(XmlReader reader, object graph)
Run Code Online (Sandbox Code Playgroud)

双方XmlSerializer并DataContractSerializer在BCL遵循想法...


Hin*_*nek 3

我认为没有办法获取 XmlReader 使用的流。解决方法是使用XmlReader.ReadOuterXml()字符串形式获取整个 XML 并将其放入MemoryStream.