删除 XML 文件的特定内容

Deleting specific content of XML file

本文关键字:XML 文件 删除      更新时间:2023-10-16

在我的 xml 文件中,我有一个节点,其子子项具有 2 个属性,我必须删除 1 个完整的子项,同时只考虑 1 个属性。我在下面举了一个例子

XML文件:

<UMG>
  <ABC Name="ABC" Value="1"></ABC>
  <ABC Name="ABC1" Value="2"></ABC>
  <ABC Name="ABC2" Value="3"></ABC>
  <ABC Name="ABC3" Value="4"></ABC>
  <ABC Name="ABC4" Value="5"></ABC>
</UMG>
 

我必须删除仅具有"Name"属性的整个子子项,因为可以更改值。

到目前为止我的代码:

void::MainWindow::XML()
{
    QString path = ui->lineEdit_7->text();
    qDebug()<<path;
    if(!file.exists() )
        {
        qDebug() << "Check your file";
    }
    QDomDocument dom;
    dom.setContent(&file);
    QDomNodeList nodes = dom.elementsByTagName("ABC");
    QDomNodeList loc_childNodes = nodes.at(0).childNodes();
    for(int i=0; i<loc_childNodes.count(); i++)
    {
        QDomNode node = loc_childNodes.at(i);
        qDebug() << node.attributes().namedItem("Name").nodeValue(); // I get all Name attributes.

最后一个qDebug给了我所有"名称"属性。我被困在使用此信息删除子项上。

编辑:

<NEW>
  <child>ABC<child>
  <child1>ABC1<child1>
  <Child3>ABC3<child3>
<NEW>

编辑2:

<MAIN>
  <SUB Name = "ABC" Value = "1"/>
  <SUB Name = "ABC1" Value = "0"/>
  <SUB Name = "ABC2" Value = "3"/>
  <Header Name = "Abc" value = "9"/>
  <SUB Name = "ABC7" Value = "3"/>
  <Header Name = "Abc5" value = "9"/>
  <SUB Name = "ABC3" Value = "3"/>
  <Header Name = "Abc0" value = "9"/>
</MAIN>

我只想删除"SUB"属性子项。预期成果:

<MAIN>
   <Header Name = "Abc" value = "9"/>
   <Header Name = "Abc5" value = "9"/>
   <Header Name = "Abc0" value = "9"/>
</MAIN>

EDit3:

qDebug()<<manualoutput_scr;
    QString path = "File"
       QFile inFile(path );
           if( !inFile.open( QIODevice::ReadOnly | QIODevice::Text ) )
           {
               qDebug( "Failed to open file for reading." );
           }
           QDomDocument dom;
           if( !dom.setContent( &inFile ) )
           {
               qDebug( "Failed to parse the file into a DOM tree." );
           }
           QDomElement docElem = dom.documentElement();
           QDomNodeList nodes = docElem.elementsByTagName("MAIN");
           QDomNodeList loc_childNodes = nodes.at(0).childNodes();
           for(int i=0; i<loc_childNodes.count(); i++)
              {
              QDomNode node = loc_childNodes.at(i);
              if( node.nodeName().compare("SUB") == 0  ) {
                  QDomNode parentNode = node.parentNode();
                  parentNode.removeChild(node);
              }
              }
           QFile outFile( path);
           if( !outFile.open( QIODevice::WriteOnly | QIODevice::Text ) )
           {
               qDebug( "Failed to open file for writing." );
           }
           QTextStream stream( &outFile );
           stream << dom.toString();
           outFile.close();

QDomNode有方法删除孩子可能有帮助吗?

从文档

QDomNode QDomNode::removeChild(const QDomNode & oldChild)

从子项列表中删除 oldChild。 oldChild 必须是直接的 此节点的子节点。在成功或 失败时为空节点。

添加 您的代码可能如下所示

if( node.attributes().namedItem("Name").nodeValue().compare("ABC3") == 0  ) {
    QDomNode parentNode = node.parentNode();
    parentNode.removeChild(node);
}

编辑 2 的补充

if( node.nodeName().compare("SUB") == 0  ) {
    QDomNode parentNode = node.parentNode();
    parentNode.removeChild(node);
}

更新以编辑 3.替换行

QDomElement docElem = dom.documentElement();
QDomNodeList nodes = docElem.elementsByTagName("MAIN");

QDomNodeList nodes = dom.elementsByTagName("MAIN");

在 parent.removeChild(node) 之后添加 i-=1,因为元素计数减少。并且不要忘记在调用File.open()之前关闭File.close()中的文件("File")