我正在用 c++ 编写一个程序来比较两个大的 XML 文件,并创建一个包含更改的产品(节点)的标识符和更改的文件。为此,我正在使用pugixml。
我现在是一名PHP开发人员,自从我使用c ++以来已经有一段时间了,所以我认为我忽略了一些微不足道的事情,但是经过几个小时的在线搜索,我仍然没有找到我的问题的解决方案,即:
child_value函数只是给出元素标签之间的值,返回一个常量字符 *。我正在尝试做的是将所有值放在一个数组中,并将它们与所有其他产品(在类似数组中)的值进行比较。
转到下一个产品时出现问题,我需要覆盖数组中的值,我认为这是我得到的分割错误的根源。所以我的问题是:
我需要使用该常量字符*进行比较,但是我需要覆盖这些值,以便进行下一次比较,最好的方法是什么?我已经尝试了strcpy,const_cast(如下面的示例代码)和大量其他建议,但似乎都产生了结果在相同的分割错误中。
它可以编译,但当它尝试覆盖第一个值时,它只会在第二次迭代时崩溃。
for (xml_node groupCurrent = groupsCurrent.child("group");groupCurrent;groupCurrent = groupCurrent.next_sibling("group")){
xml_node productsCurrent = groupCurrent.child("products");
size_t nrProductsInGroupCurrent = std::distance(productsCurrent.children().begin(), productsCurrent.children().end());
nrProductsTotalCurrent = nrProductsTotalCurrent + nrProductsInGroupCurrent;
for (xml_node productCurrent = productsCurrent.child("product");productCurrent;productCurrent = productCurrent.next_sibling("product")){
int numberAttributesC=0;
char * childrenCurrent[32];
for (xml_node attributeCurrent = productCurrent.first_child();attributeCurrent ;attributeCurrent= attributeCurrent.next_sibling()){
char * nonConstValue = const_cast<char *> (attributeCurrent.child_value());
childrenCurrent[numberAttributesC]=nonConstValue;
numberAttributesC++;
}
/*for(int i = 0;i<numberAttributesC;i++){
std::cout<<childrenCurrent[i];
}*/
//xml_node groupsNew = docNew.child("product_database");
}
}
任何帮助,建议或意见将不胜感激。如果我同时自己找到解决方案,我会在这里发布。
问候反
PS:在使用 gcc 版本 4.8.2 的 ubuntu 上
只需使用vector
and string
std::vector<std::string> childrenCurrent;
for (xml_node attributeCurrent = productCurrent.first_child();attributeCurrent ;attributeCurrent= attributeCurrent.next_sibling())
{
std::string value = attributeCurrent.child_value();
childrenCurrent.push_back(value);
}
注意:我假设child_value
正在返回const char*
string
将复制子值,从而消除任何内存问题,并且使用该vector
将使您不必担心管理潜在属性的数量。