删除XML文件的特定内容

时间:2016-01-21 08:57:17

标签: c++ xml qt

在我的xml文件中,我有一个节点,其subchilder有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”属性删除整个子子,因为Value可以更改。

我的代码到现在为止:

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>

EDIT2:

<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();

1 个答案:

答案 0 :(得分:1)

QDomNode有方法 removeChild 可能有帮助吗?

来自doc

QDomNode QDomNode::removeChild(const QDomNode & oldChild)
  

从子列表中删除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,因为元素数减少了。 并且不要忘记关闭文件(&#34; File&#34;)inFile.close()之前调用outFile.open()