FlyingCode

导航

 

需求 : 重建一棵xml树, 在重建过程中对原来的标签进行一定的修改.

具体修改部分就不给出了, 这里只提供重建部分的代码

code : 

/*************************************************************************
> File Name: rapidxml.cpp
> Author: hanhao
> Mail: hanhao@cisco.com
> Created Time: Tue 07 Nov 2017 06:37:05 AM GMT
************************************************************************/

#include<iostream>
#include<fstream>
#include"rapidxml/rapidxml.hpp"
#include"rapidxml/rapidxml_print.hpp"
#include"rapidxml/rapidxml_utils.hpp"
using namespace std;
using namespace rapidxml;
ofstream out("rapidxmloutlog.xml");
xml_document<> doc;
xml_document<> newdoc;
xml_node<> * new_cur;
xml_node<> * new_son;

void handlenode(xml_node<> *node){
    if(node->type() == node_cdata){
        new_cur->append_node(newdoc.allocate_node(rapidxml::node_cdata, NULL, node->value()));
        //catch cdata
    }
    if(node->type() == node_comment){
        new_cur->append_node(newdoc.allocate_node(rapidxml::node_comment, NULL, node->value()));
        //catch comment 
    }
    if(node->type() == node_element){
        new_son = newdoc.allocate_node(rapidxml::node_element, node->name(), node->value());
        xml_attribute<> * attr = node -> first_attribute();
        while(attr){
            new_son->append_attribute(newdoc.allocate_attribute(attr->name(), attr->value()));
            attr = attr -> next_attribute();
        }
        new_cur->append_node(new_son);
        new_cur = new_son;
        for(node = node -> first_node(); node != NULL; node = node -> next_sibling()){
            handlenode(node);
        }
        new_cur = new_cur->parent();
        //catch element
    }
}
int main(){
    xml_node<>* rot = newdoc.allocate_node(rapidxml::node_pi, newdoc.allocate_string("xml version='1.0' encoding='UTF-8'"));
    newdoc.append_node(rot);
    new_cur = newdoc.allocate_node(node_element, "han hao");
    newdoc.append_node(new_cur);
    //add header 4 new doc

    char xmldoc[] = "tahoe_call_ivr.xml";
    file<> file(xmldoc);
    doc.parse<parse_comment_nodes>(file.data());
    //parse old doc

    for(xml_node<> *node = doc.first_node(); node != NULL; node = node->next_sibling()){
        handlenode(node);
    }
    //rebuild new doc
    
    out<<newdoc<<endl;
    return 0;
}

  

posted on 2017-11-22 15:45  hhbeast  阅读(164)  评论(0)    收藏  举报