1

我有一个大的 xml 文件,我需要从中删除特定节点

QString filename= QFileDialog::getOpenFileName(this, "Choose File");
if(filename.isEmpty())
   return;

QFile file(filename);

if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
   return;

QDomDocument xmlBOM;
xmlBOM.setContent(&file);

QDomNodeList roots = xmlBOM.elementsByTagName("TEST_SCE");

for ( int i = 0; i < roots.count(); i++ )
{

   QDomElement node = roots.at(i).toElement();
   QDomNodeList noderoots = node.elementsByTagName("TEST_SET");
   for ( int j = 0; j < noderoots.count(); j++ )
   {

       QDomElement node2 = noderoots.at(j).toElement();
       QDomNodeList noderoots2 = node2.elementsByTagName("TEST");
       int count = 0;
       for ( int k = 0; k < noderoots2.count(); k++ )
       {
           QDomNode node3 = noderoots2.at(k);
           unsigned int startFreq = Node3.toElement().firstChild().toElement().attribute("start","0").toUInt();
           if (startFreq >= 20000000)
           {
               count++;
               //delete this test element
               node3.parentNode().removeChild(node3);
               k--;
           }
       }
   }   
}   
QByteArray xml = xmlBOM.toByteArray();   
file.write(xml);   
file.close();

而且我检查了 noderoots2 计数,当我删除子节点时它确实下降了,但是当我保存文件时,文件没有变化。

这是一个xml文件的例子

<VERIFICATION Location="Here" Created="11h28 2021/07/15">
  <TEST_SCE>
    <TEST_SET>
        <TEST>
            <FREQUENCY_RANGE_Hz start="2000000" stop="19000000" step="1000000"/>
        </TEST>
        <TEST>
            <FREQUENCY_RANGE_Hz start="20000000" stop="30000000" step="1000000"/>
        </TEST>
        <TEST>
            <FREQUENCY_RANGE_Hz start="31900000" stop="54000000" step="1000000"/>
        </TEST>            
    </TEST_SET>
  </TEST_SCE>
</VERIFICATION>
4

1 回答 1

0

XML 代码没有任何问题。错误与文件处理有关。

我将代码编辑如下:

  1. 之后关闭文件xmlBOM.setContent(&file);
  2. 保存更改时打开文件
   if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) {
       return;
   }

   QByteArray xml = xmlBOM.toByteArray();
   file.write(xml);
   file.close();
于 2021-10-06T07:37:34.413 回答