我想要一些关于如何以这样的方式读取'XML'文件的建议,即程序只能读取/存储在满足某些要求的节点中观察到的元素。我正在考虑以下列方式使用两个fgets:
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,或者我可以以某种方式滥用原始的文件指针?
答案 0 :(得分:2)
使用Xmllib2 http://xmlsoft.org/xml.html
等XML解析器答案 1 :(得分:0)
你的方法对于这项工作似乎并不坏。
您可以从文件中读取整行,然后使用sprintf,strstr或您喜欢的任何函数处理它。使用FILE I / O可以节省您的时间和不必要的开销。
根据您的第二个想法,您可以使用fseek()
(参考:man fseek
)或rewind()
(请参阅:man rewind
)使用相同的文件指针{{1} }。您不需要额外的文件指针。
编辑:
如果您可以更改标记格式以符合XML结构,则可以正确使用libXML2和此类库。
如果那是不可能的,那么你必须编写自己的解析器。 一些指示:
首先将文件中的数据提取到缓冲区中。缓冲区的大小以及动态或静态分配的大小取决于您的规范。
在缓冲区中搜索,如果非空格字符为fp
或标记通常以任何字符开头。如果没有,您只能显示错误并退出。
现在跟随标签名称,直到第一个空格,或/或&gt;字符。存放它们。按照您的意愿处理=,字符串和内容。
如果下一个非空白字符是/,请检查它后面是&gt;(或者您的规范中的类似模式,以查找标记是否结束)。如果是这样,您已经完成解析并可以返回结果。否则,您的格式错误,应退出并显示错误。
如果字符是&gt;,那么您已找到begin标记的结尾。现在遵循内容。 否则以下是一个论点。解析,存储结果,继续执行步骤4.
阅读内容,直至找到&lt;字符。
如果该字符后跟/,那么它就是结束标记。检查它后面跟着标签名称和&gt;。如果是,则返回结果,否则抛出错误。
如果你到了这里,你就找到了嵌套XML的开头。使用此算法解析,然后再次继续4。
虽然,这是一个非常基本的想法,但我希望它能帮助你开始。
编辑:
如果您仍想将该文件作为指针引用,请考虑使用<
。
如果你添加mmap()
一些mmap
IPC和足够的内存锁定东西,你可以编写一个并行处理程序,它将更快地处理你的大部分文件。