繁体   English   中英

同一流上有多个(顺序)XmlReader实例

[英]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解析器库可以支持这种行为?

1.凌乱的方式

如果能够保存每个序列的长度,则可以执行以下操作:

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重载)。

问题在于第一次读取操作过于贪婪,并且占用了整个时间间隔。

2.原始方式

编写您的一个流以满足您的需求!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM