如果你也对 C++ 感兴趣,你可以试试 rapidxml:
http://rapidxml.sourceforge.net/
http://rapidxml.sourceforge.net/manual.html
在这里,我编写了一个示例代码,它解析和打印深度为三个级别的 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;
}
- 注意:要将您的 xml 转换为有效的 xml,您必须关闭所有标签,因此您应该
</config>
在末尾添加,因为您<config>
在开头有。
要运行此代码,您必须从我提供的链接下载 rapidxml 并将其解压缩到您的项目文件夹中。编译不需要额外的标志。
然后,使用带有更正 xml 的输入文件“in_file.txt”(*参见上面的通知),此代码将作为输出生成:
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:
然后,您可以将结果值存储在变量、结构或任何您想要的东西中。