2016-10-23 3 views
1

Ich arbeite an einem QT-Projekt und Teil davon ist eine Rekonstruktion einer XML-Datei. Ich konnte die meisten notwendigen Änderungen mit QDom vornehmen, aber ich kann nicht finden, wie man einen Knoten umbenennt.
So die alte XML-Datei sieht aus wie ..QT DOMXml - Ändern Sie den Namen eines Knotens

<root> 
<window name="" ..> 
<element x="" y=""/> 
<element1 a="" b=""/> 
... 
</window> 
.. 
.. 
<window name=""> 
<element x="" y=""/> 
<element1 a="" b=""/> 
... 
</window> 
</root> 

Wie kann ich die XML ändern, so dass die neuen < Gruppe haben wird> statt < Fenster>?

So am Ende aussehen es braucht ..

<root> 
    <group name="" ..> 
    <element x="" y=""/> 
    <element1 a="" b=""/> 
    ... 
    </group> 
    .. 
    .. 
    <group name=""> 
    <element x="" y=""/> 
    <element1 a="" b=""/> 
    ... 
    </group> 
    </root> 

ein paar mehr Infos Hinzufügen ...
Hier den Code Ich verwende die <window> Knoten zu lesen, löschen einige basierend auf der Sichtbarkeit (kommt aus einer Liste) und ich muss <window> zu <group> für die verbleibenden Knoten ändern.

QFile oldXml("file.xml"); 
    oldXml.open(QIODevice::ReadOnly); 
    QDomDocument doc; 
    doc.setContent(&oldXml); 
    QDomNodeList nodes = doc.elementsByTagName("window"); 
    // Remove Window nodes based on visibility 
    insize = nodes.length(); 
    for (int i = 0; i < insize; i++) { 

     QDomNode node = nodes.at(i-dels); 
     if ((list2[i] == "0") | (list2[i]=="")) { 
      node.parentNode().removeChild(node); 
      dels=dels+1; 
     } else { 
      // Here is where i need to change the node name from <window> to e.g. <group> 
     } 
    } 
+0

@EdChum, er bittet um die Bearbeitung des "Namens" und nicht des "Wertes". – Naidu

Antwort

0

könnten Sie setTagName verwenden und vielleicht setAttribute, wenn Sie einen Wert für das Attribut name festlegen möchten.

Mit dem folgenden Beispiel wird myxml.xml umgewandelt xmlout.xml

  • Hinweis # 1: dies ist nur ein Beispiel: wir nur den ersten Knoten sind zu ersetzen.
  • Hinweis # 2: In diesem Beispiel verwenden wir zwei verschiedene Dateien. Abhängig von Ihrem Design können Sie dasselbe verwenden oder nicht.

myxml.xml

<root> 
<window name=""> 
<element x="" y=""/> 
<element1 a="" b=""/> 
</window> 
<window name=""> 
<element x="" y=""/> 
<element1 a="" b=""/> 
</window> 
</root> 

xmlout.xml

<root> 
    <group name="value"> 
     <element y="" x=""/> 
     <element1 a="" b=""/> 
    </group> 
    <window name=""> 
     <element y="" x=""/> 
     <element1 a="" b=""/> 
    </window> 
</root> 

main.cpp

#include <iostream> 
#include <QtXml> 
#include <QFile> 

int main(int argc, char *argv[]) 
{ 
    QDomDocument doc; 
    // Load xml file as raw data 
    QFile inFile(":myxml.xml"); 
    if (!inFile.open(QIODevice::ReadOnly)) 
    { 
     std::cerr << "Error - inFile: " << inFile.errorString().toStdString(); 
     return 1; 
    } 
    // Set data into the QDomDocument before processing 
    doc.setContent(&inFile); 

    // Get element in question 
    QDomElement root = doc.documentElement(); 
    QDomElement nodeTag = root.firstChildElement("window"); 

    nodeTag.setTagName("group"); 
    nodeTag.setAttribute("name","value"); 

    inFile.close(); 

    // Save the modified data 
    QFile outFile("xmlout.xml"); 
    if (!outFile.open(QIODevice::WriteOnly)) 
    { 
     // Error while loading file 
     std::cerr << "Error - outFile: " << outFile.errorString().toStdString(); 
     return 1; 
    } 

    QTextStream stream; 
    stream.setDevice(&outFile); 
    stream.setCodec("UTF-8"); 
    doc.save(stream,4); 
    outFile.close(); 

    return 0; 
} 
+0

Das hat den Job gemacht. Vielleicht muss ich mein XML-Wissen etwas aufpolieren. Die Antwort war direkt vor mir. Danke für die Köpfe hoch. – BobR

0

Ich habe keine direkte API-Funktion zum Umbenennen des Elements angezeigt. API erlaubt den Wert zu ändern, aber nicht den Namen.

Es gibt eine andere Runde über Weg.

ein Element erstellen, zum Beispiel:

QDomElement group = doc.createElement("group"); 

Verwendung "QDomNode des replaceChild" -Funktion.

QDomNode QDomNode::replaceChild(const QDomNode &newChild, const QDomNode &oldChild)

ex:

QDomNode dNode = node.replaceChild(group,oldNode); 
Verwandte Themen