【问题标题】:Multiple (Sequential) XmlReader instances on same stream同一流上的多个(顺序)XmlReader 实例
【发布时间】: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 序列化器,因为它可以用于网络流等,可悲的是,寻找不是一种选择。此外,向流中写入额外的“内容”以跟踪每个片段的开始位置会破坏可读性。

标签: c# xml xmlreader


【解决方案1】:

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 或字符串(参见XMLCreate 重载),即可与缓冲区混在一起。

问题是第一次读操作太GREEDY,吃掉了整个区间。

2。原路

Write your one stream to suite your needs!

【讨论】:

  • 该解决方案的问题是我需要知道 xml 的每个“位”的长度,我目前正在研究一个 Xml 序列化器,以及从最好使用相同的流(不破坏 Xml 的可读性),因为这样也可以将其用于配置。
猜你喜欢
  • 2013-10-14
  • 1970-01-01
  • 2014-12-03
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
相关资源
最近更新 更多