/* * Generate tinyxml2::XMLElement for Object through a tinyxml2::XMLDocument */ static tinyxml2::XMLElement* generateElementForObject(const Value& value, tinyxml2::XMLDocument *doc) { // object is String if (value.getType() == Value::Type::STRING) { tinyxml2::XMLElement* node = doc->NewElement("string"); tinyxml2::XMLText* content = doc->NewText(value.asString().c_str()); node->LinkEndChild(content); return node; } // object is integer if (value.getType() == Value::Type::INTEGER) { tinyxml2::XMLElement* node = doc->NewElement("integer"); tinyxml2::XMLText* content = doc->NewText(value.asString().c_str()); node->LinkEndChild(content); return node; } // object is real if (value.getType() == Value::Type::FLOAT || value.getType() == Value::Type::DOUBLE) { tinyxml2::XMLElement* node = doc->NewElement("real"); tinyxml2::XMLText* content = doc->NewText(value.asString().c_str()); node->LinkEndChild(content); return node; } //object is bool if (value.getType() == Value::Type::BOOLEAN) { tinyxml2::XMLElement* node = doc->NewElement(value.asString().c_str()); return node; } // object is Array if (value.getType() == Value::Type::VECTOR) return generateElementForArray(value.asValueVector(), doc); // object is Dictionary if (value.getType() == Value::Type::MAP) return generateElementForDict(value.asValueMap(), doc); CCLOG("This type cannot appear in property list"); return nullptr; }
bool FileUtils::writeValueVectorToFile(const ValueVector& vecData, const std::string& fullPath) { tinyxml2::XMLDocument *doc = new (std::nothrow)tinyxml2::XMLDocument(); if (nullptr == doc) return false; tinyxml2::XMLDeclaration *declaration = doc->NewDeclaration("xml version=\"1.0\" encoding=\"UTF-8\""); if (nullptr == declaration) { delete doc; return false; } doc->LinkEndChild(declaration); tinyxml2::XMLElement *docType = doc->NewElement("!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\""); doc->LinkEndChild(docType); tinyxml2::XMLElement *rootEle = doc->NewElement("plist"); rootEle->SetAttribute("version", "1.0"); if (nullptr == rootEle) { delete doc; return false; } doc->LinkEndChild(rootEle); tinyxml2::XMLElement *innerDict = generateElementForArray(vecData, doc); if (nullptr == innerDict) { delete doc; return false; } rootEle->LinkEndChild(innerDict); bool ret = tinyxml2::XML_SUCCESS == doc->SaveFile(getSuitableFOpen(fullPath).c_str()); delete doc; return ret; }