【发布时间】:2014-12-20 09:28:27
【问题描述】:
我的问题应该比较直接:
是否可以(以任何方式)按顺序为同一个流创建多个 XmlReader 对象,而第一个读取器在释放流后将其推进到末尾?
示例代码(请注意,第二次调用 ReadElement 将失败,因为第一个读取器将流推进到末尾,无论出于何种原因):
private static void DoTest()
{
using (var stream = new MemoryStream())
{
WriteElement("Test", stream);
Console.WriteLine("Stream Length after first write: {0}", stream.Length);
WriteElement("Test2", stream);
Console.WriteLine("Stream Length after second write: {0}", stream.Length);
stream.Position = 0;
Console.WriteLine(ReadElement(stream));
Console.WriteLine("Position is now: {0}/{1}", stream.Position, stream.Length);
Console.WriteLine(ReadElement(stream)); // Note that this will fail due to the stream position now being at the end.
}
}
private static string ReadElement(Stream source)
{
string result;
using (var reader = XmlReader.Create(source, new XmlReaderSettings
{
ConformanceLevel = ConformanceLevel.Fragment,
CloseInput = false
}))
{
reader.Read();
result = reader.Name;
reader.Read();
}
return result;
}
private static void WriteElement(string name, Stream target)
{
using (var writer = XmlWriter.Create(target, new XmlWriterSettings
{
ConformanceLevel = ConformanceLevel.Fragment,
WriteEndDocumentOnClose = false,
OmitXmlDeclaration = true,
}))
{
writer.WriteStartElement(name);
writer.WriteEndElement();
}
}
如果使用“纯 .Net”无法做到这一点,是否有任何替代(“Light”)Xml 解析器库可以支持这种行为?
【问题讨论】:
-
正如您已经演示过的那样,您可以简单地将流重置回其原始位置(当然,前提是您的流是可搜索的)。你如何设想在不寻求的情况下做到这一点?您需要将流内容复制到内存中,然后您可以创建所有您喜欢的阅读器。你想解决什么问题?
-
我正在开发一个 Xml 序列化器,因为它可以用于网络流等,可悲的是,寻找不是一种选择。此外,向流中写入额外的“内容”以跟踪每个片段的开始位置会破坏可读性。