C++ 如何使用TinyXML保存对XML文件的更改?
我正在从事一个项目,该项目要求我将XML文件中的一些数据加载到GUI中。GUI允许用户对数据进行一些更改。我希望能够做的是将这些更改保存回XML文件 我知道重写整个文件是可能的,但这个文件相当大,而且文件中的所有数据都没有被更改,甚至没有在我的程序中使用C++ 如何使用TinyXML保存对XML文件的更改?,c++,xml-parsing,c++builder,tinyxml,C++,Xml Parsing,C++builder,Tinyxml,我正在从事一个项目,该项目要求我将XML文件中的一些数据加载到GUI中。GUI允许用户对数据进行一些更改。我希望能够做的是将这些更改保存回XML文件 我知道重写整个文件是可能的,但这个文件相当大,而且文件中的所有数据都没有被更改,甚至没有在我的程序中使用 这是我第一个用TinyXML和C++ Builder工作的项目。我只是想就如何处理这一问题寻求一些建议 除非您确定新文本的大小与旧文本完全相同,否则通常只重写文本文件的一部分不是一个好主意。有些文件格式可以进行逐段替换。XML不是其中之一。至少
<>这是我第一个用TinyXML和C++ Builder工作的项目。我只是想就如何处理这一问题寻求一些建议 除非您确定新文本的大小与旧文本完全相同,否则通常只重写文本文件的一部分不是一个好主意。有些文件格式可以进行逐段替换。XML不是其中之一。至少在一般情况下不是这样
在文件中间插入数据,从而使其余部分向下移动,基本上等同于加载文件的其余部分,使文件更大,并将其写入。因此,您可以加载整个文件,进行修改,然后再次保存。您的代码将更简单,并且可能不会慢很多
不,SAX解析器在这里帮不了你。它允许流式读取(虽然我建议使用拉式解析器而不是推式解析器),但这不允许将数据插入文件。据我所知,大多数XML解析器通常不支持这一点。它们可以写入数据,但写入和非破坏性插入是两件不同的事情。除非您确定新文本的大小与旧文本完全相同,否则通常只重写文本文件的一部分不是一个好主意。有些文件格式可以进行逐段替换。XML不是其中之一。至少在一般情况下不是这样
在文件中间插入数据,从而使其余部分向下移动,基本上等同于加载文件的其余部分,使文件更大,并将其写入。因此,您可以加载整个文件,进行修改,然后再次保存。您的代码将更简单,并且可能不会慢很多
不,SAX解析器在这里帮不了你。它允许流式读取(虽然我建议使用拉式解析器而不是推式解析器),但这不允许将数据插入文件。据我所知,大多数XML解析器通常不支持这一点。它们可以写入数据,但写入和非破坏性插入是两码事。Update 正如我在评论中所说的,我不认为如果你在文件的中间插入内容会更好。但是,如果您需要/想要额外的安全性,我建议您采取两个额外的步骤:- 在所有重要步骤中对xml文件执行健全性检查。这可以是任何您确保您正在读取的文件是您真正需要的文件的地方
- 在保存之前计算整个文件内容的校验和,然后进行检查。这不一定需要是CRC,我只是将函数命名为
。任何可以让您验证数据完整性的东西都是好的calculate\u CRC()
delete_file()
和rename_file()
替换为适合您环境的API或库函数
可以专门设计函数calculate\u crc()
和verify\u crc()
,只检查需要保持不变的部分。更新
正如我在评论中所说的,我不认为如果你在文件的中间插入内容会更好。但是,如果您需要/想要额外的安全性,我建议您采取两个额外的步骤:
- 在所有重要步骤中对xml文件执行健全性检查。这可以是任何您确保您正在读取的文件是您真正需要的文件的地方
- 在保存之前计算整个文件内容的校验和,然后进行检查。这不一定需要是CRC,我只是将函数命名为
。任何可以让您验证数据完整性的东西都是好的calculate\u CRC()
delete_file()
和rename_file()
替换为适合您环境的API或库函数
可以专门设计函数
calculate\u crc()
和verify\u crc()
,只检查需要保持不变的部分。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
换东西
很抱歉这么匆忙的解释,但是你需要仔细阅读一下文档才能掌握窍门
cheersTinyXml将允许您在不损坏文件内容的情况下执行任何操作(只要其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);