2016-12-16 35 views
0

ローカルマシンにxmlファイルがあります。 xmlファイル形式は次のようになります。QTでxmlノードデータを文字列に変換するには

<string> 
     <Data> 
       <Name>Sanket</Name> 
       <Number>0987654321</Number> 
       <Address>India</Address> 
     </Data> 
     <Data> 
       <Name>Rahul</Name> 
       <Number>0987654321</Number> 
       <Address>Maharashtra</Address> 
     </Data> 
</string> 

このXMLファイルのデータをString形式に変換します。同様に:

Sanket 0987654321 India Rahul 0987654321 Maharashtra

のC++を使用してQTでこのデータを変換する最も簡単な方法は何ですか。 私はこれで新しくなっていますので、誰も私にこれのためのサンプルコードを提案することができますか? ありがとうございます。

私は、次のコードを試してみましたが、それは私のために動作しません:

void parseFile() 
{ 
QList<QList<QString> > dataSet; 

QString lastError = ""; 
QFile inFile("test.xml"); 
if (inFile.open(QIODevice::ReadOnly)) 
{ 
    QTextStream fread(&inFile); 
    long totalSize = inFile.size(); 
    QString line; 
    while(!fread.atEnd()) 
    { 
     line = fread.readLine(); 
     QList<QString> record = line.split(QString::KeepEmptyParts); 
     dataSet.append(record); 

    } 
    qDebug()<<dataSet; 
}else{ 
    lastError = "Could not open "+test.xml+" for reading"; 
} 
} 

答えて

1

あなたはQXmlStreamReaderを経由して、まずXML要素を解析でき、その後、あなたが望むどのように文字列にXML要素を組み立てることができます。

+1

QXmlStreamReaderの使い方の例といくつかのコードとポインタを追加することで、回答を改善することができます。 http://www.walletfox.com/course/qxmlstreamreaderexample.php – talamaki

0

はすでに(とコード付き)質問:Reading an XML file using QXmlStreamReader

QtはXMLを扱うためのクラスのセットを提供します。

http://doc.qt.io/qt-5.7/qtxml-index.html

http://doc.qt.io/qt-5.7/qxmlstreamreader.html

http://doc.qt.io/qt-5.7/qxmlstreamwriter.html

旧C++クラス(維持されない)

http://doc.qt.io/qt-5/qtxml-module.html

あなたはこれらを使用してファイルを解析されたら、あなたは通常、個々のノードの内部テキストまたは属性を読み取ることができます。

0

あなたの問題コードは、xmlクラスによって処理されたxml-syntaxなしでテキスト行のみを処理することです。

Florent UguetにいくつかのリンクがあるQtXMLクラスを見てください。

私は変形例がが(それはあなたの正確な入力のためにその正確な事をして)あなたがやりたいhereが見つかりました:

#include <QDomDocument> 
#include <QFile> 
#include <iostream> 
#include <QDomNodeList> 

int main() 
{ 
    QDomDocument doc("mydocument"); 
    QFile file("test.xml"); 
    if (!file.open(QIODevice::ReadOnly)) 
     return 1; 
    if (!doc.setContent(&file)) { 
     file.close(); 
     return 1; 
    } 
    file.close(); 

    const auto stringTags = doc.elementsByTagName("string"); 

    for(int stringsI = 0; stringsI < stringTags.size(); ++stringsI){ 
     QDomNode stringTag = stringTags.at(stringsI); 
     for(QDomNode dataTag = stringTag.firstChildElement("Data"); !dataTag.isNull(); dataTag = dataTag.nextSiblingElement("Data")){ 
      for(QDomNode innerTag = dataTag.firstChild(); !innerTag.isNull(); innerTag = innerTag.nextSibling()){ 
       auto val = innerTag.toElement().text(); 
       std::cout << val.toStdString() << " "; 
      } 
      std::cout << std::endl; 
     } 
    } 

    return 0; 
} 

私はqmakeのを使用してQtCreatorでそれを構築します。このためには、QT += xmlを* .proファイルに入れる必要があることを知っておく必要があります。

+0

お返事ありがとうございます。あなたのコードでは、エラーがあります:エラー: 'stringTags'の型名はありません –

+0

g ++をコンパイラとして使用する場合、マイコードはC++ 11用に書かれています。-std = C++ 11 。 C++ 11用のコンパイラがない場合は、 "auto"キーワードを、呼び出された関数によって返される型(QDomElementなど)に置き換える必要があります。 –

関連する問題