RapidXml使用小结
还是那句话,代码使用的粗陋,但是可以参考:(注意变量生命周期)
void saveAsXml(const CString& path)
{
if (m_pRoot)
{
//::DeleteFile(path);
//using namespace rapidxml;
//xml_document<> doc;
root->remove_all_nodes();
root->remove_all_attributes();
m_pRoot->SaveConfigureAsXml(doc, root);
std::string xml_as_string;
rapidxml::print(std::back_inserter(xml_as_string), doc);
std::ofstream fileStored("file.xml");
fileStored << xml_as_string;
fileStored.close();
//doc.clear();
/*CFile file;
file.Open(path, CFile::modeCreate | CFile::modeReadWrite);
file.Write(pBuffer, Used);
file.Close();*/
}
}
void loadFromXml(const CString& path, int xmlVersion/* = 0*/)
{
//xml_node<> * root_node;
const auto xmlFile = loadFile(path);//"file_stored.xml"
if (!xmlFile.empty()) {
const auto tmp = xmlFile;
processXmlFile(xmlFile.data(), xmlVersion);
}
}
void processXmlFile(const char* data, int xmlVersion) {
enum {
PARSE_FLAGS = rapidxml::parse_non_destructive
};
// NOTE : There is a `const_cast<>`, but `rapidxml::parse_non_destructive`
// guarantees `data` is not overwritten.
rapidxml::xml_document<> xmlDoc;
xmlDoc.parse<PARSE_FLAGS>(const_cast<char*>(data));//root_node = doc.first_node("root")->first_node("XXXRectangle");
//walk(doc.first_node(),0,xmlVersion);//doc.first_node()
xml_node<>* node = xmlDoc.first_node();
std::vector<const xml_node<>*> vec0;
vec0.push_back(node);
std::vector<std::vector<const xml_node<>*>> vecAll;
vecAll.push_back(vec0);
for (int indent = 0;; ++indent){
if (indent>=vecAll.size()) {
break;
}
std::vector<const xml_node<>*>& vec=vecAll[indent];
std::vector<const xml_node<>*> add;
for (int i = 0; i < vec.size();++i)
{
node = const_cast<xml_node<>*>(vec[i]);
const auto ind = std::string(indent * 4, ' ');
printf("%s", ind.c_str());
const node_type t = node->type();
switch (t) {
case node_element:
{
if (xmlVersion == 2) {
if (!strncmp(node->name(), "mxCell", 6)) {
xml_attribute<>* a = node->first_attribute("id"),*b=NULL;
string id(a->value(), a->value_size());
if (std::stoi(id) != 0) {
//if (std::stoi(id) == 1) {
//} else {
a = node->first_attribute("style");
b = node->first_attribute("value");
if (a != NULL) {
string* style = new string(a->value(), a->value_size());
if (b != NULL && b->value_size()>0) {
string value(b->value(), b->value_size());
size_t start = value.find(""><b>");
if (start != string::npos) {
size_t end = value.find("<", start + 19);
if (end != string::npos) {
LoadXXXText2(const_cast<xml_node<>*>(node), xmlVersion);
}else {
LoadXXXRectangle2(const_cast<xml_node<>*>(node), xmlVersion);
}
}else {
start = value.find("">");
if (start != string::npos) {
LoadXXXText2(const_cast<xml_node<>*>(node), xmlVersion);
}else {
LoadXXXRectangle2(const_cast<xml_node<>*>(node), xmlVersion);
}
}
}
else if (style->find("。。。。") != string::npos ||
style->find("。。。。")!=string::npos ||
style->find("。。。。") != string::npos) {
LoadXXXStaticDrawing2(const_cast<xml_node<>*>(node), xmlVersion);//圆
}else if (style->find("whiteSpace") != string::npos) {
LoadXXXRectangle2(const_cast<xml_node<>*>(node), xmlVersion);
}else if (style->find("startArrow") != string::npos) {//折线
LoadXXXStaticDrawing2(const_cast<xml_node<>*>(node), xmlVersion);
}else if (style->find("endArrow") != string::npos) {//线段
LoadXXXLine2(const_cast<xml_node<>*>(node), xmlVersion);
}
delete style;
}
//}
}
}
}
else {
//printf("<%.*s", node->name_size(), node->name());
if (!strncmp(node->name(), "XXXBase", 11)) {
LoadXXXBase2(const_cast<xml_node<>*>(node), xmlVersion);
}
else if (!strncmp(node->name(), "XXXRectangle", 16)) {
if (strncmp(node->first_attribute("Parent")->value(), "-1", 2))
{
LoadXXXRectangle2(const_cast<xml_node<>*>(node), xmlVersion);
}
}
else if (!strncmp(node->name(), "XXXRadioButton", 18)) {
LoadXXXRadioButton2(const_cast<xml_node<>*>(node), xmlVersion);
}
else if (!strncmp(node->name(), "XXXText", 11)) {
LoadXXXText2(const_cast<xml_node<>*>(node), xmlVersion);
}
else if (!strncmp(node->name(), "XXXLine", 11)) {
LoadXXXLine2(const_cast<xml_node<>*>(node), xmlVersion);
}
else if (!strncmp(node->name(), "XXXStaticDrawing", 20)) {
LoadXXXStaticDrawing2(const_cast<xml_node<>*>(node), xmlVersion);
}
}
//for (const xml_attribute<>* a = node->first_attribute(); a; a = a->next_attribute()) {
// printf(" %.*s", a->name_size(), a->name());
// printf("='%.*s'", a->value_size(), a->value());
//}
//printf(">\n");
for (const xml_node<>* n = node->first_node(); n; n = n->next_sibling()) {
add.push_back(n);
//walk(n, indent + 1, xmlVersion);
}
//printf("%s</%.*s>\n", ind.c_str(), node->name_size(), node->name());
}
break;
case node_data:
printf("DATA:[%.*s]\n", node->value_size(), node->value());
break;
default:
printf("NODE-TYPE:%d\n", t);
break;
}
}
if (add.size() > 0) {
vecAll.push_back(add);
}
}
}
void init(xml_node<>* node, XXXBase* m_pRoot, xml_document<>& doc, int xmlVersion)
{
data.FatherId = GetIntValueByName(node, "Parent", -1, xmlVersion);
...
data.ResetEcho = GetStrValueByName(node, "ResetEcho", "reset", xmlVersion);
//============
data.D90 = GetIntValueByName(node, "D90", 0, xmlVersion);
...
data.Ziti = GetStrValueByName(node, "Ziti", "黑体", xmlVersion);
if (true || node == NULL || xmlVersion == 2) {
this->m_node = doc.allocate_node(node_element, "XXXRectangle");
this->m_node->append_attribute(doc.allocate_attribute("Parent", doc.allocate_string(std::to_string(data.FatherId).c_str())));
this->m_node->append_attribute(doc.allocate_attribute("ID", doc.allocate_string(std::to_string(data.ID).c_str())));
this->m_node->append_attribute(doc.allocate_attribute("NameofIt", doc.allocate_string(data.NameofIt.c_str())));
...
this->m_node->append_attribute(doc.allocate_attribute("BitCheckedValueFrm", doc.allocate_string(std::to_string(data.BitCheckedValueFrm).c_str())));
this->m_node->append_attribute(doc.allocate_attribute("BitCheckedValueToo", doc.allocate_string(std::to_string(data.BitCheckedValueToo).c_str())));
...
//===
this->m_node->append_attribute(doc.allocate_attribute("D90", doc.allocate_string(std::to_string(data.D90).c_str())));
...
}
XXXBase* pParent = GetWidgetById(m_pRoot, data.FatherId);
pParent->AddChild(this);
this->WidgetId = data.ID;
if (theApp.GlobalIndex <= data.ID) theApp.GlobalIndex = data.ID + 1;
ANSIToUnicode(data.NameofIt.c_str(), this->NameofItPlus);
this->LcX = data.LcX;
...
this->pFramePen = new Pen(Color(data.pFramePenColorA, data.pFramePenColorR, data.pFramePenColorG, data.pFramePenColorB), data.PenWidth);
this->dashVals[0] = data.dashVals[0];
this->dashVals[1] = data.dashVals[1];
if (this->dashVals[0]>0. && this->dashVals[1]>0.)
{
this->pFramePen->SetDashPattern(this->dashVals, 2);
}
this->pMainBrush = new SolidBrush(Color(data.pMainBrushColorA, data.pMainBrushColorR, data.pMainBrushColorG, data.pMainBrushColorB));
this->m_pAboutReg = FindRegObject(strtoul(data.m_ulBaseAddress.c_str(), NULL, 16), strtoul(data.m_ulOffsetAddress.c_str(), NULL, 16));
if (this->m_pAboutReg)
{
AddRegToTable(this->m_pAboutReg);
}
this->m_pFuncSetEnable = (FUN_SET_ENABLE)FindFunction(CString(data.m_pFuncSetEnable.c_str()));
...
//===
this->D90 = data.D90;
this->DrawBk = data.DrawBk;
...
this->TextSize = data.TextSize;
ANSIToUnicode(data.ShowText.c_str(), this->ShowText);
this->pTextBrush = new SolidBrush(Color(data.pTextBrushColorA, data.pTextBrushColorR, data.pTextBrushColorG, data.pTextBrushColorB));
ANSIToUnicode(data.Ziti.c_str(), this->Ziti);
}
BOOL SaveConfigureAsXml(xml_document<>& doc, xml_node<> * parent)
{
XXXBase* pEachSon = pFirstSun;
while (NULL != pEachSon)
{
pEachSon->SaveConfigureAsXml(doc, m_node);
pEachSon = pEachSon->pBrother;
}
if (theApp.GlobalIndex <= data.ID) theApp.GlobalIndex = data.ID + 1;
//==
char rsut[128];
UnicodeToANSI(this->NameofItPlus, rsut);
this->m_node->first_attribute("NameofIt")->value(doc.allocate_string(rsut));
...
Color c;
this->pFramePen->GetColor(&c);
this->m_node->first_attribute("pFramePenColorA")->value(doc.allocate_string(std::to_string(static_cast<int>(c.GetA())).c_str()));
...
this->pMainBrush->GetColor(&c);
this->m_node->first_attribute("pMainBrushColorA")->value(doc.allocate_string(std::to_string(static_cast<int>(c.GetA())).c_str()));
...
if (m_pAboutReg)
{
CString FloatString;
FloatString.Format("0x%08X", m_pAboutReg->m_ulBaseAddress);
this->m_node->first_attribute("m_ulBaseAddress")->value(doc.allocate_string(FloatString));//mark
FloatString.Format("0x%04X", m_pAboutReg->m_ulOffsetAddress);
this->m_node->first_attribute("m_ulOffsetAddress")->value(doc.allocate_string(FloatString));
}
this->m_node->first_attribute("m_pFuncSetEnable")->value(doc.allocate_string(GetFuncNameByAddr(this->m_pFuncSetEnable)));
...
UnicodeToANSI(this->ResetEcho, rsut);
this->m_node->first_attribute("ResetEcho")->value(doc.allocate_string(rsut));
//===
if (this->TextSize > 0) {
this->m_node->first_attribute("D90")->value(doc.allocate_string(std::to_string(this->D90).c_str()));
this->m_node->first_attribute("DrawBk")->value(doc.allocate_string(std::to_string(this->DrawBk).c_str()));
....
UnicodeToANSI(this->ShowText, rsut);
this->m_node->first_attribute("ShowText")->value(doc.allocate_string(rsut));
}
if (this->pTextBrush) {
this->pTextBrush->GetColor(&c);
this->m_node->first_attribute("pTextBrushColorA")->value(doc.allocate_string(std::to_string(c.GetA()).c_str()));
....
UnicodeToANSI(this->Ziti, rsut);
this->m_node->first_attribute("Ziti")->value(doc.allocate_string(rsut));
}
parent->append_node(m_node);
return TRUE;
}参考:https://www.cnblogs.com/hihilary/archive/2012/11/18/2772983.html
参考:https://www.cnblogs.com/chutianyao/p/3246592.html
参考:https://blog.csdn.net/wqvbjhc/article/details/7662931
参考:https://github.com/dwd/rapidxml
参考:https://github.com/dwd/rapidxml/blob/master/test/simple.cpp
参考:https://blog.csdn.net/u012209790/article/details/56014779
参考:https://stackoverflow.com/questions/4583409/add-number-double-float-as-attribute-to-rapidxml-node
参考:http://rapidxml.sourceforge.net/manual.html#namespacerapidxml_1printing
参考:https://stackoverflow.com/questions/46300376/rapidxml-parsing-misbehavior-when-subfunction-is-used
参考:https://github.com/rstudio/rstudio/blob/master/src/cpp/core/include/core/rapidxml/rapidxml.hpp
参考:https://stackoverflow.com/questions/53593933/write-to-xml-with-rapidxml
参考:https://gist.github.com/JSchaenzle/2726944
参考:https://blog.csdn.net/hellokandy/article/details/56834236
参考:https://gist.github.com/t-mat/7150417
参考:https://gist.github.com/JSchaenzle/2726944
参考:https://stackoverflow.com/questions/2808022/how-to-parse-the-xml-file-in-rapidxml
- 点赞
- 收藏
- 关注作者
评论(0)