Изменить и добавить содержимое в файл XML - PullRequest
1 голос
/ 14 февраля 2020

У меня есть XML файл следующего формата.

<!DOCTYPE newproject>
<subject_details>
 <Name>Name5</Name>
 <Surname>Surname5</Surname>
 <Patient_ID>PID05</Patient_ID>
 <Date>01/01/2000 00:00</Date>
 <Clinician_Note>note note</Clinician_Note>
 <Settings>
  <Current>19</Current>
  <PW>25</PW>
  <Freq>26</Freq>
 </Settings>
</subject_details>

Где дочерние узлы Settings - Current, PW и Freq. Их значения трех различных QSlider.

Чтобы добавить содержимое в узел Settings, я делаю следующие шаги, как показано ниже:

  1. Откройте XML файл только для чтения, прочитайте его все, закройте его.
  2. Внесите изменения в документ в памяти.
  3. Затем откройте файл для перезаписи, запишите все содержимое, закройте файл.

См. Код:

     //Open the file read-only, read it all in, close it.
     if(!file.open(QIODevice::ReadOnly  | QIODevice::Text))
        {
            qDebug () << "Error saving XML file....";
            QMessageBox::information(this, "Unable to open file for read", file.errorString());
            return;
        }

        QDomDocument document;
        document.setContent(&file);
        QDomElement root = document.documentElement();

        file.close();

       // Make changes in-memory document.

        QDomElement newTag = document.createElement(QString("Settings"));

        QDomNode SettingsNode = root.elementsByTagName("Settings").at(0).firstChild();
        QDomElement SettingsNodeVal = SettingsNode.toElement();

        if (SettingsNodeVal.isNull())
        {

            QDomElement newCurrTag = document.createElement(QString("Current"));
            QDomText newCurrVal = document.createTextNode(currVal);
            newCurrTag.appendChild(newCurrVal);
            newTag.appendChild(newCurrTag);

            QDomElement newPWTag = document.createElement(QString("PW"));
            QDomText newPWVal = document.createTextNode(PWVal);
            newPWTag.appendChild(newPWVal);
            newTag.appendChild(newPWTag);

            QDomElement newFreqTag = document.createElement(QString("Freq"));
            QDomText newFreqVal = document.createTextNode(FreqVal);
            newFreqTag.appendChild(newFreqVal);
            newTag.appendChild(newFreqTag);


            root.appendChild(newTag);
        }

        //Then open the file for overwrite, write all content, close file.

        if(!file.open(QIODevice::WriteOnly  | QIODevice::Text))
        {
            qDebug () << "Error saving XML file....";
            QMessageBox::information(this, "Unable to open file for write", file.errorString());
            return;
        }

        QTextStream output(&file);
        output << document.toString();
        file.close();

        }

Здесь я могу добавить Children в узел Settings, если он пуст. Это отлично работает.

Мой следующий шаг:

Я хочу изменить существующие Settings дочерние узлы (Current, PW и Freq et c.).

Может кто-нибудь показать мне, как изменить существующие значения узлов в приведенном выше примере?

Заранее спасибо

1 Ответ

1 голос
/ 19 февраля 2020

Мы можем использовать setNodeValue для изменения значений в текстовом узле, например:

      QDomElement root = document.documentElement();
      QDomNode SettingsNode = root.namedItem("Settings");

      QDomNode cur = SettingsNode.namedItem("Current");
      cur.firstChild().setNodeValue("new value1"); // Note the extra FirstChild() its to get the INNER QDomText

      QDomNode pw = SettingsNode.namedItem("PW");
      pw.firstChild().setNodeValue("new value2");

      QDomNode freq = SettingsNode.namedItem("Freq");
      freq.firstChild().setNodeValue("new value3");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...