Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否有可能克隆xmlTextReader(或多次读取)?_C_Xml_Xml Parsing_Libxml2_Xmlreader - Fatal编程技术网

C 是否有可能克隆xmlTextReader(或多次读取)?

C 是否有可能克隆xmlTextReader(或多次读取)?,c,xml,xml-parsing,libxml2,xmlreader,C,Xml,Xml Parsing,Libxml2,Xmlreader,我目前必须修复一个现有的应用程序,以使用of以外的东西,因为它传递的XML文件太大,无法加载到内存中 我已经重写了数据加载,从在DOM树上迭代到现在大部分使用,没有太多问题。(我使用xmlnetextreaderfilename打开本地文件。) 然而,事实证明,大数据所在的子树必须按顺序读取,但我必须先收集一些(少量)数据。(问题是,正是这棵子树包含了大量的数据,因此仅将这棵子树加载到内存中也没有多大意义。) 最简单的方法是“克隆”/“复制”我当前的阅读器,提前阅读,然后返回到原始实例继续阅读。

我目前必须修复一个现有的应用程序,以使用of以外的东西,因为它传递的XML文件太大,无法加载到内存中

我已经重写了数据加载,从在DOM树上迭代到现在大部分使用,没有太多问题。(我使用
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
,丢弃结果,直到到达要重新开始的位置

是的,您必须重新解析整个文档,但这可能足够快。(实际上可能比缓存文档的很大一部分更好/更快。)