![](/img/trans.png)
[英].NET XmlReader on SslStream - reading multiple XMLs from stream - obtatining XmlDocument
[英]Multiple (Sequential) XmlReader instances on same stream
我的问题应该相对简单:
是否可以(以任何方式)为相同的流顺序创建多个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();
}
}
如果“ pure .Net”无法做到这一点,那么是否还有其他替代(“ Light”)Xml解析器库可以支持这种行为?
如果能够保存每个序列的长度,则可以执行以下操作:
int len, i = 0; //len is the length of the interval
byte[] buffer = new byte[0xff];
while (len --> 0)
buffer[i++] = stream.ReadByte (); //copies the interval
这将分别从MemoryStream复制一个字节间隔并将其保存到缓冲区中 。 然后,您可以通过将缓冲区分配给新的MemoryStream或String来与缓冲区混为一谈 (请参阅XMLCreate重载)。
问题在于第一次读取操作过于贪婪,并且占用了整个时间间隔。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.