C ++にも興味がある場合は、rapidxmlを試してみてください。
http://rapidxml.sourceforge.net/
http://rapidxml.sourceforge.net/manual.html
ここでは、3つのレベルの深さの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:
次に、結果の値を変数、構造体、または任意の値に格納できます。