从XmlReader获取流

本文关键字:获取 XmlReader | 更新日期: 2023-09-27 18:01:04

作为存储过程的结果,我得到了一个SqlXml对象,从中我可以调用CreateReader来得到一个标准的XmlReader,这样我就可以在dll中处理它。

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

然而,XMySerializer.Deserialize函数需要一个系统。IO。流作为输入。

那么,问题是如何从System.Xml.XmlReader中获得System.IO.Stream

相反会更容易。。。

从XmlReader获取流

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

var xmlStream = new XmlTranslatorStream(xmlReader);

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

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

希望能有所帮助,
Jay

XmlReader可能有也可能没有Stream支持。我曾尝试过一些使用反射的方法,试图让StreamTextWriter支持XmlReader,但最终我认为将对象写入新的流可能是最简单的;我建议使用这种方法,而不是接受的答案,因为接受的答案在大型文档上不会表现得很好,而且这基本上是Jay答案中BizTalk版本的简化版本(BizTalk会自动检测它应该使用FileStream还是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);
        }
    }
}

CopyTo将允许您随心所欲地设置流;ToStream为您提供了一些有用的常见情况,您只想快速获得常规MemoryStream(用于较小的XML文件(或使用FileStream(用于较大的文件(。

当然,最后,如果您真的是为了序列化目的而这样做的,那么最好只在序列化类中添加一个重载,比如:

XMySerializer.Deserialize(XmlReader reader, object graph)

BCL中的CCD_ 18和CCD_。。。

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

您不能。XmlReader是一个抽象类,它有许多实现(包括一些从流中读取的实现,但另一些与流无关(。但是,您可以将此XML读取器中的数据写入System.IO.MemoryStream,然后将此流提供给XMySerializer.Deserialize函数。