2016-10-23 8 views
1

QT Projectで作業しています。その一部はXMLファイルの再構築です。私はQDomで必要な変更のほとんどを行うことができましたが、ノードの名前を変更する方法は見つけられません。
だから古いXMLファイルが> <ウィンドウの代わりに>新しいものが<グループを有するように QT DOMXml - ノードの名前を変更します。

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

がどのように私は、XMLを変更することができます...のように見えますか?

だから最後にそれは...

いくつかの詳細情報を追加
<root> 
    <group name="" ..> 
    <element x="" y=""/> 
    <element1 a="" b=""/> 
    ... 
    </group> 
    .. 
    .. 
    <group name=""> 
    <element x="" y=""/> 
    <element1 a="" b=""/> 
    ... 
    </group> 
    </root> 

のように見える必要がある...ここで
は、私が<window>ノードを読み取るために使用したコードである、可視性に基づいて、いくつかを削除します(リストから来ます)、残りのノードについては<window>から<group>に変更する必要があります。

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、彼は "値"ではなく "名前"の編集を求めています。 – Naidu

答えて

0

あなたはname属性の値を設定したい場合は、setTagName、多分setAttributeを使用することができます。次の例では

myxml.xmlxmlout.xml

  • に変換されたノート#1:これは単なる例である:我々は最初のノードを交換しています。
  • 注2:この例では、2つの異なるファイルを使用しています。あなたのデザインに応じて、あなたは同じかどうかを使用することができます。

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

それは仕事をしました。たぶん、私は少し私のXML知識を磨く必要があります。その答えは私の目の前にあった。ヘッドアップをありがとう。 – BobR

0

要素の名前を変更するための直線的なAPI関数はありませんでした。 APIでは値は変更できますが、名前は変更できません。

もう1つのラウンドについてです。

例えば、要素を作成します。

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

使用 "QDomNodeのREPLACECHILD" 機能を。

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

例:

QDomNode dNode = node.replaceChild(group,oldNode); 
関連する問題