std::string xml2json(const char *xml_str) { //file<> fdoc("track_orig.xml"); rapidxml::xml_document<> doc; doc.parse<0>(const_cast<char *>(xml_str)); rapidjson::Document document; document.SetObject(); rapidjson::Document::AllocatorType& allocator = document.GetAllocator(); rapidxml::xml_node<> *xmlnode_chd; for (xmlnode_chd = doc.first_node(); xmlnode_chd; xmlnode_chd = xmlnode_chd->next_sibling()) { //cout << xmlnode_chd->name() << endl; rapidjson::Value jsvalue_chd; jsvalue_chd.SetObject(); traverse_node(xmlnode_chd, jsvalue_chd, allocator); document.AddMember(rapidjson::StringRef(xmlnode_chd->name()), jsvalue_chd, allocator); } rapidjson::StringBuffer buffer; rapidjson::Writer<rapidjson::StringBuffer> writer(buffer); document.Accept(writer); return buffer.GetString(); }
bool test_reverser_list() { node_t *head = NULL; add_node(&head, 1); add_node(&head, 2); add_node(&head, 3); add_node(&head, 4); add_node(&head, 5); add_node(&head, 6); reverse_list(&head); traverse_node(head, print_node); return list_len_rec(head) == 6 && head->val == 6; }
void test_remove_dups() { node_t *head = NULL; add_node(&head, 1); add_node(&head, 1); add_node(&head, 1); add_node(&head, 2); add_node(&head, 2); node_t *new_head = remove_list_dups(&head); assert(list_len(new_head) == 2); traverse_node(new_head, print_node); }
void traverse_node(node_type& cur, Functor execute,char* word,int index) { if(cur.freq) { std::string str = word; execute(str,cur.freq); } for(int i=0; i < Size; ++i) { if(cur.child[i] != 0) { word[index++] = 'a' + i; traverse_node(*cur.child[i],execute,word,index); word[index] = 0; index--; } } }
void traverse_node(rapidxml::xml_node<> *xmlnode, rapidjson::Value &jsvalue, rapidjson::Document::AllocatorType& allocator) { //cout << "this: " << xmlnode->type() << " name: " << xmlnode->name() << " value: " << xmlnode->value() << endl; rapidjson::Value jsvalue_chd; jsvalue.SetObject(); jsvalue_chd.SetObject(); rapidxml::xml_node<> *xmlnode_chd; // classified discussion: if ((xmlnode->type() == rapidxml::node_data || xmlnode->type() == rapidxml::node_cdata) && xmlnode->value()) { // case: pure_text jsvalue.SetString(xmlnode->value(), allocator); // then addmember("#text" , jsvalue, allocator) } else if (xmlnode->type() == rapidxml::node_element) { if (xmlnode->first_attribute()) { if (xmlnode->first_node() && xmlnode->first_node()->type() == rapidxml::node_data && count_children(xmlnode) == 1) { // case: <e attr="xxx">text</e> rapidjson::Value jn, jv; jn.SetString("#text", allocator); jv.SetString(xmlnode->first_node()->value(), allocator); jsvalue.AddMember(jn, jv, allocator); add_attributes(xmlnode, jsvalue, allocator); return; } else { // case: <e attr="xxx">...</e> add_attributes(xmlnode, jsvalue, allocator); } } else { if (!xmlnode->first_node()) { // case: <e /> jsvalue.SetNull(); return; } else if (xmlnode->first_node()->type() == rapidxml::node_data && count_children(xmlnode) == 1) { // case: <e>text</e> jsvalue.SetString(rapidjson::StringRef(xmlnode->first_node()->value()), allocator); return; } } if (xmlnode->first_node()) { // case: complex else... std::map<std::string, int> name_count; for (xmlnode_chd = xmlnode->first_node(); xmlnode_chd; xmlnode_chd = xmlnode_chd->next_sibling()) { std::string current_name; const char *name_ptr = NULL; rapidjson::Value jn, jv; if (xmlnode_chd->type() == rapidxml::node_data || xmlnode_chd->type() == rapidxml::node_cdata) { current_name = "#text"; name_count[current_name]++; jv.SetString("#text", allocator); name_ptr = jv.GetString(); } else if (xmlnode_chd->type() == rapidxml::node_element) { current_name = xmlnode_chd->name(); name_count[current_name]++; name_ptr = xmlnode_chd->name(); } traverse_node(xmlnode_chd, jsvalue_chd, allocator); if (name_count[current_name] > 1 && name_ptr) to_array_form(name_ptr, jsvalue, jsvalue_chd, allocator); else { jn.SetString(name_ptr, allocator); jsvalue.AddMember(jn, jsvalue_chd, allocator); } } } } else { std::cerr << "err data!!" << std::endl; } }
void traverse( Functor execute = Functor()) { char word[100] = {0}; traverse_node(root, execute,word,0); }