C 是否有可能克隆xmlTextReader(或多次读取)?
我目前必须修复一个现有的应用程序,以使用of以外的东西,因为它传递的XML文件太大,无法加载到内存中 我已经重写了数据加载,从在DOM树上迭代到现在大部分使用,没有太多问题。(我使用C 是否有可能克隆xmlTextReader(或多次读取)?,c,xml,xml-parsing,libxml2,xmlreader,C,Xml,Xml Parsing,Libxml2,Xmlreader,我目前必须修复一个现有的应用程序,以使用of以外的东西,因为它传递的XML文件太大,无法加载到内存中 我已经重写了数据加载,从在DOM树上迭代到现在大部分使用,没有太多问题。(我使用xmlnetextreaderfilename打开本地文件。) 然而,事实证明,大数据所在的子树必须按顺序读取,但我必须先收集一些(少量)数据。(问题是,正是这棵子树包含了大量的数据,因此仅将这棵子树加载到内存中也没有多大意义。) 最简单的方法是“克隆”/“复制”我当前的阅读器,提前阅读,然后返回到原始实例继续阅读。
xmlnetextreaderfilename
打开本地文件。)
然而,事实证明,大数据所在的子树必须按顺序读取,但我必须先收集一些(少量)数据。(问题是,正是这棵子树包含了大量的数据,因此仅将这棵子树加载到内存中也没有多大意义。)
最简单的方法是“克隆”/“复制”我当前的阅读器,提前阅读,然后返回到原始实例继续阅读。(似乎我……甚至在C端实现了一些东西:)
然而,似乎没有任何方法可以“复制”xmlTextReader的状态
如果我不能重读一个文件的一部分,我也可以重读整个文件,虽然这很浪费,在这里也可以,但是我仍然需要记住我之前在哪里
对于xmlTextReader,是否有一种简单的方法可以记住它在当前文档中的位置,以便我以后在再次读取文档/文件时可以再次找到该位置
下面是一个问题示例:
<root>
<cat1>
<data attrib="x1">
... here goes up to one GB in stuff ...
</data>
<data attrib="y2"> <!-- <<< Want to remember this position without having to re-read the stuff before -->
... even more stuff ...
</data>
<data attrib="z3">
<!-- I need (part of) the data here to meaningfully interpret the data in [y2] that
came before. The best approach would seem to first skip all that data
and then start back there at <data attrib="y2"> ... not having to re-read
the whole [x1] data would be a big plus! -->
</data>
</cat1>
...
</root>
... 这里的数据量高达1 GB。。。
... 甚至更多的东西。。。
...
我想从以下几点给出一个解决方案:
没有简单的方法可以“克隆”xmlReader上的状态,但是,应该可以而且应该非常简单的方法是计算对文档的读取次数
也就是说,要使用xmlReader读取文档,您可能需要调用以下命令:
// looping ...
status = ::xmlTextReaderRead(pReader);
如果您以结构化的方式这样做(例如,我最终编写了一个封装xmlReader使用模式的小包装器类),那么添加计数器就相对容易:
// looping ...
status = ::xmlTextReaderRead(pReader);
if (1 == status) { // success
++m_ReadCounter;
}
要重新读取文档(到达某个位置),只需调用xmlTextReaderRead
多次m_ReadCounter
,丢弃结果,直到到达要重新开始的位置
是的,您必须重新解析整个文档,但这可能足够快。(实际上可能比缓存文档的很大一部分更好/更快。)我想从以下几点给出一个解决方法: 没有简单的方法可以“克隆”xmlReader上的状态,但是,应该可以而且应该非常简单的方法是计算对文档的读取次数 也就是说,要使用xmlReader读取文档,您可能需要调用以下命令:
// looping ...
status = ::xmlTextReaderRead(pReader);
如果您以结构化的方式这样做(例如,我最终编写了一个封装xmlReader使用模式的小包装器类),那么添加计数器就相对容易:
// looping ...
status = ::xmlTextReaderRead(pReader);
if (1 == status) { // success
++m_ReadCounter;
}
要重新读取文档(到达某个位置),只需调用xmlTextReaderRead
多次m_ReadCounter
,丢弃结果,直到到达要重新开始的位置
是的,您必须重新解析整个文档,但这可能足够快。(实际上可能比缓存文档的很大一部分更好/更快。)