Как сохранить изменения в XML-файл, используя TinyXML? - PullRequest
1 голос
/ 28 февраля 2012

Я работаю над проектом, который требует от меня загрузки некоторых данных из файла XML в графический интерфейс.GUI позволяет пользователю вносить некоторые изменения в данные.Что я хочу сделать, это сохранить эти изменения обратно в файл XML.

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

Это мой первый проект, работающий с TinyXML и C ++ Builder.Я просто ищу некоторые предложения относительно того, как я должен подходить к этому.

Ответы [ 3 ]

4 голосов
/ 28 февраля 2012

Если вы не уверены, что новый текст будет точно такого же размера, как и старый, перезапись только части текстового файла в целом не является хорошей идеей.Существуют форматы файлов, где возможна частичная замена.XML не является одним из них.По крайней мере, не в общем случае.

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

И нет, парсер SAX здесь вам не поможет.Он позволяет вам читать поток (хотя я бы посоветовал использовать парсеры, а не пуш), но это не позволит вам вставлять данные в файл.Это обычно не поддерживается большинством парсеров XML, о которых я знаю.Они могут записывать данные, но запись и неразрушающая вставка - это две разные вещи.

2 голосов
/ 07 марта 2012

TinyXml позволит вам делать то, что вы хотите, не повреждая содержимое файла (до тех пор, пока его действительный XML). Я только что проверил это, так что я совершенно уверен. Очевидно, что вы должны точно знать, какие атрибуты и теги вы хотите редактировать, но вы можете добавлять / редактировать теги, не затрагивая существующие атрибуты / теги / комментарии, даже внутри тегов, которые вы редактируете. Это займет некоторое время, пока вы не привыкнете к структуре, но это определенно возможно.

Вы должны знать структуру xml!

TiXmlDocument doc("filepath"); //will open your document

if (!doc.LoadFile()) //you do have to open the whole file
{
    cout<<"No XML structure found"<<endl;
    return; // exit function don't load anything
}
TiXmlElement *root = doc.RootElement(); //pointer to root element

Теперь вы можете использовать этот указатель и такие команды, как:

root->FirstChild("tageone")->ToElement();
tageone->SetDoubleAttribute("attribute", value);

чтобы изменить вещи.

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

ура

0 голосов
/ 28 февраля 2012

Обновление

Как я сказал в комментарии, я не думаю, что вам лучше, если вы вставите в середину файла. Однако, если вам нужна / требуется дополнительная безопасность, я предлагаю два дополнительных шага:

  • выполнить проверку работоспособности xml-файла на всех важных этапах. Это может быть что угодно, если вы уверены, что файл, который вы читаете, действительно то, что вам нужно.
  • вычислите контрольную сумму содержимого всего файла перед сохранением и проверьте его позже. Это не обязательно должен быть CRC, я просто назвал функцию calculate_crc(). Все, что позволяет проверить целостность данных, хорошо.

Я бы сделал это примерно следующим образом (псевдокод):

TiXmlDocument doc( "demo.xml" );
doc.LoadFile();

perform_sanitycheck(doc);

//  do whatever you need to change

perform_sanitycheck(doc);
unsigned int crc = calculate_crc(doc);

doc.SaveFile("temp_name.xml");  // save the file under another name

TiXmlDocument doc2( "temp_name.xml" );
perform_sanitycheck(doc2);
if(verify_crc(doc, crc))
{
    delete_file("demo.xml");
    rename_file("temp_name.xml", "demo.xml");
}

Проверка работоспособности примет соответствующие меры. Вам необходимо заменить две функции delete_file() и rename_file() API или библиотечной функцией для вашей среды.

Функции calculate_crc() и verify_crc() могут быть специально созданы для проверки только тех частей, которые вам нужны без изменений.

...