rapidxml是一个快速的xml库,由C++模板实现的高效率xml解析库,同时也是boost库的property_tree的内置解析库。
当时rapidxml时,只需要把rapidxml.hpp 、 rapidxml_print.hpp 和 rapidxml_utils.hpp 三个文件拷贝到你的工程目录下,就可以了。
下面的是测试代码 main.cpp
#include <iostream>
#include <string>
#include <vector>
#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_print.hpp"
#include "rapidxml/rapidxml_utils.hpp"
using namespace std;
int main(int argc, char** argv) {
vector<string> v_str ;
vector<string>::iterator it ;
v_str.push_back("111111");
v_str.push_back("222222");
v_str.push_back("333333");
v_str.push_back("444444");
using namespace rapidxml;
xml_document<> doc; //构造一个空的xml文档
xml_node<>* rot = doc.allocate_node(rapidxml::node_pi, doc.allocate_string("setting.xml version='1.0' encoding='utf-8'"));//allocate_node分配一个节点,该节点类型为node_pi,对XML文件进行描,描述内容在allocate_string中
doc.append_node(rot); //把该节点添加到doc中
xml_node<>* node = doc.allocate_node(node_element, "root", NULL);
xml_node<>* analysis = doc.allocate_node(node_element, "Analysis", NULL);
node->append_node(analysis);
for (it = v_str.begin(); it != v_str.end(); it++) {
xml_node<>* soinfo = doc.allocate_node(node_element, "soinfo", NULL);
soinfo->append_attribute(doc.allocate_attribute("key", it->c_str()));
analysis->append_node(soinfo);
}
xml_node<>* Output = doc.allocate_node(node_element, "Output", NULL);
node->append_node(Output);
xml_node<>* outinfo = doc.allocate_node(node_element, "outinfo", NULL);
Output->append_node(outinfo);
for (int j =0;j < 2; j++) {
xml_node<>* type = doc.allocate_node(node_element, "desc", NULL); //分配一个type节点,
type->append_attribute(doc.allocate_attribute("path", "123"));
type->append_attribute(doc.allocate_attribute("relation", "345"));
type->append_attribute(doc.allocate_attribute("priority", "567"));
outinfo->append_node(type); //把type节点添加到节点outinfo中
}
for (it = v_str.begin(); it != v_str.end(); it++) {
xml_node<>* rule = doc.allocate_node(node_element, "rule", NULL);
Output->append_node(rule);
for (int i = 0; i < 2 ; i++) {
xml_node<>* cond = doc.allocate_node(node_element, "cond", NULL);
cond->append_attribute(doc.allocate_attribute("key", "123"));
cond->append_attribute(doc.allocate_attribute("value", "345"));
cond->append_attribute(doc.allocate_attribute("relation","567"));
rule->append_node(cond);
}
xml_node<>* out = doc.allocate_node(node_element, "out", NULL);
out->append_attribute(doc.allocate_attribute("where", it->c_str()));
rule->append_node(out);
}
doc.append_node(node);
std::ofstream pout("config.xml");
pout << doc;
return 0;
}
下面是生成的xml文件 config.xml
<?setting.xml version='1.0' encoding='utf-8' ?>
<root>
<Analysis>
<soinfo key="111111"/>
<soinfo key="222222"/>
<soinfo key="333333"/>
<soinfo key="444444"/>
</Analysis>
<Output>
<outinfo>
<desc path="123" relation="345" priority="567"/>
<desc path="123" relation="345" priority="567"/>
</outinfo>
<rule>
<cond key="123" value="345" relation="567"/>
<cond key="123" value="345" relation="567"/>
<out where="111111"/>
</rule>
<rule>
<cond key="123" value="345" relation="567"/>
<cond key="123" value="345" relation="567"/>
<out where="222222"/>
</rule>
<rule>
<cond key="123" value="345" relation="567"/>
<cond key="123" value="345" relation="567"/>
<out where="333333"/>
</rule>
<rule>
<cond key="123" value="345" relation="567"/>
<cond key="123" value="345" relation="567"/>
<out where="444444"/>
</rule>
</Output>
</root>