C++ 如何使用TinyXML保存对XML文件的更改?

C++ 如何使用TinyXML保存对XML文件的更改?,c++,xml-parsing,c++builder,tinyxml,C++,Xml Parsing,C++builder,Tinyxml,我正在从事一个项目,该项目要求我将XML文件中的一些数据加载到GUI中。GUI允许用户对数据进行一些更改。我希望能够做的是将这些更改保存回XML文件 我知道重写整个文件是可能的,但这个文件相当大,而且文件中的所有数据都没有被更改,甚至没有在我的程序中使用 这是我第一个用TinyXML和C++ Builder工作的项目。我只是想就如何处理这一问题寻求一些建议 除非您确定新文本的大小与旧文本完全相同,否则通常只重写文本文件的一部分不是一个好主意。有些文件格式可以进行逐段替换。XML不是其中之一。至少

我正在从事一个项目,该项目要求我将XML文件中的一些数据加载到GUI中。GUI允许用户对数据进行一些更改。我希望能够做的是将这些更改保存回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
换东西

很抱歉这么匆忙的解释,但是你需要仔细阅读一下文档才能掌握窍门


cheers

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);