作为一个库存过程的结果,我收到一个SqlXml对象,我可以从中调用CreateReader以获得标准,XmlReader以便我可以在我的dll中处理它.
在应用程序的业务层中,我有一个XMySerializer可以读取xml并实例化业务对象的.
但是,该XMySerializer.Deserialize函数将System.IO.Stream作为输入.
所以,问题是我怎么能得到System.IO.Stream 从一个System.Xml.XmlReader?反向会更容易......
实际上,你可以.
它只需要一些并非每个人都使用的库,因为它们是BizTalk的一部分.
如果您有权访问BizTalk运行时,则可以使用XmlTranslatorStream从XmlReader实例提供Stream实例:
var xmlStream = new XmlTranslatorStream(xmlReader);
Run Code Online (Sandbox Code Playgroud)
您可以使用3个构造函数.
是的,从XmlReader获取Stream的非常大的要求,所以你可以看到为什么大多数答案等同于"你不能从这里到达那里!"
希望有所帮助,
周杰伦
该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遵循想法...
我认为没有办法获取 XmlReader 使用的流。解决方法是使用XmlReader.ReadOuterXml()字符串形式获取整个 XML 并将其放入MemoryStream.