0

我想要一些关于如何读取类似“XML”的文件的建议,这样程序只会读取/存储在满足某些要求的节点中观察到的元素。我正在考虑通过以下方式使用两个 fget:

while (fgets(file_buffer,line_buffer,fp) != NULL)
 {
   if (p_str = (char*) strstr(file_buffer,"<element of interest opening")) )
    {
      //new fgets that starts at fp and runs only until the end of the node
       {
         //read and process
       }
    }
 }

这有意义还是有更聪明的方法来做到这一点?

其次(在我的想法中),我是否必须定义一个新的 FILE*(如 fr),在第二个 fgets 开始时将 fr 设置为 fp,或者我可以为此滥用原始文件指针吗?

4

2 回答 2

2

使用 XML 解析器,如 Xmllib2 http://xmlsoft.org/xml.html

于 2013-01-24T10:28:09.880 回答
0

你的方法似乎对这份工作还不错。

您可以从文件中读取整行,然后使用 sprintf、strstr 或任何您喜欢的函数对其进行处理。这将节省您使用 FILE I/O 的时间和不必要的开销。

根据您的第二个想法,您可以使用fseek()(Refer: man fseek) 或rewind()(Refer: man rewind) 使用相同的文件指针fp。您不需要额外的文件指针。

编辑:

如果您可以更改标签格式以符合 XML 结构,您将能够正确使用 libXML2 和此类库。

如果这不可能,那么您必须编写自己的解析器。几点建议:

  1. 首先将文件中的数据提取到缓冲区中。缓冲区的大小以及是动态分配还是静态分配,取决于您的规范。

  2. 如果非空白字符是非空白字符<或您的标签通常以任何字符开头,则在缓冲区中搜索。如果没有,您可以只显示错误并退出。

  3. 现在跟随标签名称,直到第一个空格,或 / 或 > 字符。存储它们。根据需要处理 =、字符串和其他内容。

  4. 如果下一个非空白字符是 /,请检查它后面是否跟着 >(或您的规范中的类似模式以查找标签是否结束)。如果是这样,您已完成解析并可以返回结果。否则,您的标签格式错误,应该退出并出现错误。

    如果字符是 >,那么您已经找到了开始标签的结尾。现在跟随内容。否则接下来是一个论点。解析,存储结果,继续第 4 步。

  5. 阅读内容,直到找到 < 字符。

  6. 如果该字符后跟 /,则它是结束标记。检查其后跟标签名称和 >。如果是,则返回结果,否则,抛出错误。

  7. 如果您到了这里,就会发现嵌套 XML 的开头。用这个算法解析它,然后再次在 4 处继续。

虽然,这是一个非常基本的想法,但我希望它可以帮助你开始。

编辑:如果您仍想将文件作为指针引用,请考虑使用mmap().

如果您添加mmap一些shared memoryIPC 和足够的内存锁定内容,您可以编写一个并行处理程序,这将更快地处理您的大部分文件。

于 2013-01-24T10:27:14.867 回答