从XmlReader获取流

时间:2011-07-05 14:31:09

标签: c# .net

作为库存程序的结果,我收到了一个SqlXml对象,我可以从中调用CreateReader来获得标准XmlReader,以便我可以在我的dll中处理它。< / p>

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

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

所以,问题是如何从System.IO.Stream获得System.Xml.XmlReader ? 反方向会更容易......

4 个答案:

答案 0 :(得分:8)

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

var xmlStream = new XmlTranslatorStream(xmlReader);
您可以使用

There are 3 constructors

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

希望有所帮助,

答案 1 :(得分:4)

XmlReader可能会或可能不会由Stream支持。我曾经使用反射试图让StreamTextWriter支持XmlReader,但最终我认为编写对象可能是最直截了当的。到一个新的流;我推荐这种方法超过了接受的答案,因为接受的答案在大型文档上表现不佳,这基本上是Jay答案中BizTalk版本的简化版本( BizTalk会自动检测是否应该使用FileStreamMemoryStream并对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(针对较大的XML文件)。

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

XMySerializer.Deserialize(XmlReader reader, object graph)

BCL中的XmlSerializerDataContractSerializer都遵循这个想法......

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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