提问人:janullo789 提问时间:8/16/2022 最后编辑:janullo789 更新时间:8/31/2022 访问量:363
删除 XML 文件 C++ 中的选定子元素
Removing selected child elements in a XML file C++
问:
我正在使用 tinyxml2。我有一个节点上有许多元素的 xml 文件。我的xml文件:
<city>
<school>
<class>
<boy name="Jose">
<age>14</age>
</boy>
<boy name="Jim">
<age>15</age>
</boy>
<boy name="Mike">
<age>13</age>
</boy>
<boy name="Ben">
<age>14</age>
</boy>
<boy name="Eddy">
<age>14</age>
</boy>
<boy name="Jim">
<age>16</age>
</boy>
</class>
</school>
</city>
例如,我必须删除最后三个男孩。我写了这个,但它不起作用。
void cropData(char *titlecity)
{
tinyxml2::XMLNode *city = nullptr;
tinyxml2::XMLNode *school = nullptr;
tinyxml2::XMLNode *class = nullptr;
tinyxml2::XMLError result;
tinyxml2::XMLDocument doccity;
doccity.LoadFile(titlecity);
tinyxml2::XMLNode* root = doccity.FirstChild();
if(root == nullptr)
std::cout << "Cannot open file" << std::endl;
city = doccity.FirstChildElement("city");
assert(city);
school = city->FirstChildElement("school");
assert(school);
class = school->FirstChildElement("class");
assert(class);
int i = 0;
for (tinyxml2::XMLElement *boy = class->FirstChildElement("boy"); boy; boy = boy->NextSiblingElement("boy"))
{
if(i>3)
{
boy->Parent()->DeleteChild(boy);
}
i++;
}
doccity.SaveFile("DeleteAttribute_demo_file.txt");
}
此代码不会更改文件。 我真的很抱歉,如果我的英语不好。
答:
1赞
jwezorek
8/16/2022
#1
该代码中有两个错误。一个是语法错误,另一个是逻辑错误。
语法错误是无法将变量命名为“class”,因为“class”是 C++ 中的保留字。
逻辑错误是循环通过使用元素的 getter 函数递增来迭代元素;但是,一旦删除某个元素,其下一个元素将不再有效。for
NextSiblingElement
见下文:
void cropData(tinyxml2::XMLDocument& doccity)
{
auto* city = doccity.FirstChildElement("city");
auto* school = city->FirstChildElement("school");
auto* class_ = school->FirstChildElement("class");
int i = 0;
auto* boy = class_->FirstChildElement("boy");
while (boy != nullptr) {
auto next = boy->NextSiblingElement("boy");
if (i > 3) {
boy->Parent()->DeleteChild(boy);
}
boy = next;
++i;
}
doccity.SaveFile("DeleteAttribute_demo_file.txt");
}
int main() {
static const char* xml =
"<?xml version=\"1.0\"?>"
"<city>"
" <school>"
" <class>"
" <boy name=\"Jose\">"
" <age>14</age>"
" </boy>"
" <boy name=\"Jim\">"
" <age>15</age>"
" </boy>"
" <boy name=\"Mike\">"
" <age>13</age>"
" </boy>"
" <boy name=\"Ben\">"
" <age>14</age>"
" </boy>"
" <boy name=\"Eddy\">"
" <age>14</age>"
" </boy>"
" <boy name=\"Jim\">"
" <age>16</age>"
" </boy>"
" </class>"
" </school>"
"</city>";
tinyxml2::XMLDocument doc;
doc.Parse(xml);
cropData(doc);
}
评论
2赞
janullo789
8/16/2022
谢谢!事实上,我有一个更广泛的代码和例子,男孩和班级只是简化,但谢谢你指出这一点。我已经修复了一个有逻辑错误的循环,现在一切正常!
评论