如何在C中解析/提取xml文件中的某些信息
可能重复:如何在C中解析/提取xml文件中的某些信息,c,xml-parsing,C,Xml Parsing,可能重复: 你好 我需要一些关于如何使用C从XML文件中解析/提取信息的快速帮助 我正在努力做的项目只是为了个人学习。我正在努力自学C语言。我正在尝试编写一个程序,从预生成的XML配置文件中搜索spacefic文本或作者姓名 下面是我的XML的副本: <?xml version="1.0" encoding="ISO-8859-1"?> <config> <quote> <text> "Moral indigna
你好 我需要一些关于如何使用C从XML文件中解析/提取信息的快速帮助 我正在努力做的项目只是为了个人学习。我正在努力自学C语言。我正在尝试编写一个程序,从预生成的XML配置文件中搜索spacefic文本或作者姓名 下面是我的XML的副本:
<?xml version="1.0" encoding="ISO-8859-1"?>
<config>
<quote>
<text>
"Moral indignation is jealous with a halo."
</text>
<author>
H.G. Wells
</author>
<livedfrom>
1866-1946
</livedfrom>
<extrainfo />
</quote>
“道德上的愤怒是带着光环的嫉妒。”
赫伯特·乔治·威尔斯
1866-1946
如果有人能帮我入门,或者指导我阅读一些在线阅读材料或教程,我将不胜感激
谢谢,无论如何,这将归结为解析文本的艺术。您应该阅读正式语法,也许可以研究如何使用Flex和Bison构建一个简单的解析器 否则,构建解析器的一种经典方法是使用一个前瞻标记执行所谓的递归体面解析器 然而,解析器总是与标记器一起工作。Tokenizer任务是将某些字符串转换为标记(通常作为数值实现)。托克通常携带从中生成的字符串(或从字符串生成的某个值(不是令牌值),例如某个数值常量),以便解析器可以采取适当的操作。正则表达式通常用于告诉标记器要将哪个字符串转换为哪个标记 因此,再次回到递归解析器。它看起来像下面的代码。但请查看更多信息,例如
void handle_token_foo()
{
//Do something now when we know we handle token FOO
....
//Find next token and take appropriate action
Token t = tokenizer.get_next_token();
if(t == TOKEN_TYPE_BAR)
{
parse_token_bar();
}
else if(t == TOKEN_TYPE_FOO)
{
parse_token_foo();
}
else if(t == TOKEN_TYPE_END)
{
return;
}
throw ParseError();
return
}
void handle_token_bar()
{
//Do something now when we know we handle token BAR
....
//Find next token and take appropriate action
Token t = tokenizer.get_next_token();
if(t == TOKEN_TYPE_BAR)
{
parse_token_bar();
}
else if(t == TOKEN_TYPE_FOO)
{
parse_token_foo();
}
else if(t == TOKEN_TYPE_END)
{
return;
}
throw ParseError();
return;
}
“dosomething部分”可以在堆栈上推送值和运算符,以实现某种形式的操作。或者建造一个
然而,BoostBoost::spirit
中还有一个很好的库,可以用来构建解析器
因此,另一方面,如果您只是想要一个XML解析器,那么有许多现成的解析器可供选择。在这里已经看到了一些不错的流程图,因此描述了基于您的需求的WETCHXML解析器是好的。 < P>如果您对C++也感兴趣,可以尝试RAPIDXML:< /P>
在这里,我编写了一个示例代码,用于解析和打印深度为三个级别的xml内容(如您的):
然后,您可以将结果值存储在变量、结构或任何您想要的东西中。从处理XML文件开始学习C是一项雄心勃勃的任务。买一本好的C语言书,然后先看一遍。dup的可能副本可能不是您想要的,但它仍然是一个dup;)如果如您所说是出于学习目的,那么最好在开始使用xml之前先尝试读/写一个纯文本文件。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "./rapidxml-1.13/rapidxml.hpp"
#include "./rapidxml-1.13/rapidxml_print.hpp"
#include <iostream>
#include <fstream>
using namespace std;
using namespace rapidxml;
void process_xml(const char* xml){
xml_document<> doc;
char text[strlen(xml)+1];
strcpy(&text[0], xml);
try{
doc.parse<parse_default>(text);
}
catch(rapidxml::parse_error &ex){
cout << "error: rapidxml::parse_error\n";
return;
}
xml_node<> *ptr=NULL;
try{
if (doc.first_node()!=NULL){
for (xml_node<> *node=doc.first_node(); node; node=node->next_sibling()){
cout << "node->name: " << node->name() << endl;
if (strcmp(node->name(), "")!=0){
xml_node<> *content_node = node->first_node();
ptr=content_node;
while ((content_node!=NULL) && (strcmp(content_node->name(), "")!=0)){
cout << "\t>>" << content_node->name() << endl;
for (xml_node<> *node_3rd=content_node->first_node(); node_3rd; node_3rd=node_3rd->next_sibling()){
cout << "name: " << node_3rd->name() << "; ";
cout << "value: " << node_3rd->value() << endl;
}
content_node=content_node->next_sibling();
}
}
}
cout << "\n";
}
}
catch(...){
cout << "error: in reading an event!";
}
}
int main(void){
//read the xml from an input file
std::ifstream ifs("in_file.txt");
std::string xml;
xml.assign(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());
//process the xml
process_xml(xml.c_str());
return 0;
}
node->name: config
>>quote
name: text; value:
"Moral indignation is jealous with a halo."
name: author; value:
H.G. Wells
name: livedfrom; value:
1866-1946
name: extrainfo; value: