删除 XML 文件 C++ 中的选定子元素

Removing selected child elements in a XML file C++

提问人:janullo789 提问时间:8/16/2022 最后编辑:janullo789 更新时间:8/31/2022 访问量:363

问:

我正在使用 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");
}

此代码不会更改文件。 我真的很抱歉,如果我的英语不好。

C++ 解析 tinyxml2

评论


答:

1赞 jwezorek 8/16/2022 #1

该代码中有两个错误。一个是语法错误,另一个是逻辑错误。

语法错误是无法将变量命名为“class”,因为“class”是 C++ 中的保留字。

逻辑错误是循环通过使用元素的 getter 函数递增来迭代元素;但是,一旦删除某个元素,其下一个元素将不再有效。forNextSiblingElement

见下文:

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
谢谢!事实上,我有一个更广泛的代码和例子,男孩和班级只是简化,但谢谢你指出这一点。我已经修复了一个有逻辑错误的循环,现在一切正常!