Qt XML повторяющиеся теги - PullRequest
       110

Qt XML повторяющиеся теги

0 голосов
/ 06 августа 2020

У меня есть файл xml, и я просто хочу продублировать некоторые определенные c узлы:

От (пример):

<1>
 <2>
 </2>
</1>

до:

<1>
 <2>
 </2>
 <2>
 </2>
</1>

Я пробовал следующее:

    for(int i = 0; i < xmlRoot.childNodes().count(); i++)    {
    if(xmlRoot.childNodes().at(i).isElement()){
        if(xmlRoot.childNodes().at(i).toElement().attribute("id") == "teamSection"){ //find goal element
            teamNode = xmlRoot.childNodes().at(i).cloneNode(); //copy element

            if(xmlRoot.childNodes().at(i).insertAfter(teamNode, xmlRoot.childNodes().at(i)).isNull()){
                qDebug() << "not worked";
            }
            else{
                qDebug() << "worked";
            }
            break;
        }
    }
}

Но я думаю, что неправильно понял refChiled - потому что мое решение просто возвращает null. (https://doc.qt.io/qt-5/qdomnode.html - вставить после). Как я могу продублировать простой узел?

1 Ответ

1 голос
/ 06 августа 2020

Проблема в этой строке:

xmlRoot.childNodes().at(i).insertAfter(teamNode, xmlRoot.childNodes().at(i))  

Метод insertAfter принимает два аргумента - новый узел и узел, который будет ссылкой для вставки нового узла. Но оба эти аргумента должны быть потомками общего родителя, для которого вызывается insertAfter. Схематично ваш код похож на child->insertAfter(newChild, child), а должен быть parent->insertAfter(newChild, child). Вы можете посмотреть на код ниже:

for (int i = 0; i < xmlRoot.childNodes().count(); i++)
{
    if (xmlRoot.childNodes().at(i).isElement())
    {
        if(xmlRoot.childNodes().at(i).toElement().attribute("id") == "teamSection")
        {
            auto teamNode = xmlRoot.childNodes().at(i).cloneNode(); //copy element
            auto sibling = xmlRoot.childNodes().at(i);

            if (xmlRoot.insertAfter(teamNode, sibling).isNull())
            {
                qDebug() << "not worked";
            }
            else
            {
                qDebug() << "worked";
            }
            break;
        }
    }
}
...