Обновление данных в крошечном элементе Xml

Мой вопрос: возможно ли изменить данные в элементе xml?

Что я хочу сделать, это изменить данные в элементе в зависимости от того, какая кнопка нажата. В настоящее время у меня есть чтение и запись в xml-файл, но я хочу изменить его, записать новый элемент в первый раз, а затем редактировать элемент, так как он в настоящее время просто продолжает писать новый элемент каждый раз.

Это мой текущий код для написания нового элемента

if (doc.LoadFile(XMLDOC) == tinyxml2::XML_SUCCESS){
//Get Root Node
tinyxml2::XMLElement* rootNode = doc.FirstChildElement();//Assets
//Get Next Node
tinyxml2::XMLElement* childNode = rootNode->FirstChildElement();//imagePaths
//Temp Element
tinyxml2::XMLElement* temp = nullptr;
tinyxml2::XMLElement* temp2 = childNode->FirstChildElement();//path

while (temp2 != nullptr){
temp = temp2;
temp2 = temp2->NextSiblingElement("path");
}
if (temp != nullptr){
//write the text
tinyxml2::XMLComment* newComment = doc.NewComment("Selected Player");
tinyxml2::XMLElement* newElement = doc.NewElement("path");

//get text passed in
newElement->SetText(choice.c_str());

newElement->SetAttribute("name", "selected_player");
childNode->InsertAfterChild(temp, newComment);
childNode->InsertAfterChild(newComment, newElement);

}
//doc.Print();
doc.SaveFile(XMLDOC);
}
else{
std::cout << "Could Not Load XML Document : %s" << XMLDOC << std::endl;
}
}

Спасибо за помощь в продвинутом

0

Решение

Я не уверен на 100%, какое желаемое поведение вы хотите. Вот пример кода, основанный на примере кода вашего вопроса:

#include "tinyxml2.h"#include <iostream>
#include <string>

#define XMLDOC "test.xml"
std::string choice = "New Text";

int main()
{
tinyxml2::XMLDocument doc;
if (doc.LoadFile(XMLDOC) == tinyxml2::XML_SUCCESS){
//Get Root Node
tinyxml2::XMLElement* rootNode = doc.FirstChildElement();//Assets
//Get Next Node
tinyxml2::XMLElement* childNode = rootNode->FirstChildElement();//imagePaths
//Path Node
tinyxml2::XMLElement* pathNode = childNode->FirstChildElement();//path

if (pathNode == nullptr){
//write the text
tinyxml2::XMLComment* newComment = doc.NewComment("Selected Player");
tinyxml2::XMLElement* newElement = doc.NewElement("path");

newElement->SetAttribute("name", "selected_player");
newElement->SetText(choice.c_str());

childNode->InsertFirstChild(newComment);
childNode->InsertAfterChild(newComment, newElement);
}
else{
pathNode->SetText(choice.c_str());
}
doc.SaveFile(XMLDOC);
}
else{
std::cout << "Could Not Load XML Document : " << XMLDOC << std::endl;
}
}

Учитывая XML-файл, который выглядит следующим образом:

<Assets>
<ImagePaths>
</ImagePaths>
</Assets>

После запуска это будет выглядеть так:

<Assets>
<ImagePaths>
<!--Selected Player-->
<path name="selected_player">New Text</path>
</ImagePaths>
</Assets>

И если вы снова запустите программу, вы получите только один путь к узлу с текстом, который содержит выбранная вами строка.

Надеюсь, это поможет!

1

Другие решения


По вопросам рекламы [email protected]