11

次のXMLドキュメントがあるとしましょう。

<root>
    <options>
        ...
    </options>
    <children>
        <child name="first">12345</child>
        <child name="second">
            <additionalInfo>abcd</additionalInfo>
    </children>
</root>

「子」ノードの文字列表現を取得し、それらを配列に追加したいと思います(XML構文を失いたくないので、.text()はオプションではありません)。たとえば、最初の子は次のようになります。

QString child = "<child name="first">12345</child>";

次のコードを使用して要素を取得しました。

QDomDocument doc;
QDomElement element;
element = xml->documentElement();
if(element.isNull() == false)
{
    element = element.firstChildElement("children");
    if(element.isNull()) return;

    element = element.firstChildElement("child");
    while(element.isNull() == false)
    {
        doc = element.toDocument();
        if(doc.isNull() == false)
        {
            // save string into array
            array.append(doc.toString());
        }
        element = element.nextSiblingElement("child");
    }
}

問題は、doc.isNullが常にfalseを返すことです(要素をドキュメントに変換できないように見えます)。これを実行する方法はありますか?

編集:

ここで、QStringは必須ではないことを付け加えたいと思います。基本的に、後でデータを取得するために使用できるクラスはすべて問題ありません(これらのノードを保存し、後で別のオブジェクトを初期化するために使用します)。重要なことは、元のドキュメントが破棄された場合でもこれらの値にアクセスできる必要があることです。たとえば、これらの要素を配列(QListなど)に直接格納して、後でアクセスすることができます。

4

3 に答える 3

19

私は自分の質問に答えを追加します。理由はわかりませんが、ドキュメントで次の機能を見逃したようです。

void QDomNode::save ( QTextStream & str, int indent ) const

ノードを文字列に変換するために必要なほとんどすべてのことを行います。

QString str;
QTextStream stream(&str);
QDomNode node = xml->documentElement().firstChildElement("child");

node.save(stream, 4 /*indent*/);

// process str
于 2010-07-27T06:38:55.893 に答える
0

XML形式自体が必要なので、QDomElementまたはは必要ありませんQDomDocument。XMLドキュメントに保存されQDomElementいるデータを取得するためにQDomDocument使用されます。

通常のファイルトラバーサルが必要です。

を使用してファイルを開く

bool QFile::open ( OpenMode mode )   [virtual]

次の方法でファイルの内容全体を読み取ることができます。

QByteArray QIODevice::readAll ()

これをに割り当てることができますQString

たとえば、

QString entireContents = xmlFile->readAll();

次に、を使用して改行 \n文字に基づいてコンテンツ全体を分割できます。

QStringList QString::split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const

これで、各インデックスはXMLファイルの各行に対応します。あなたはそれを横断して、興味のある希望の線を得ることができます。

それが役に立てば幸い...

于 2010-07-14T09:15:09.033 に答える
0

Qt XMLクラスでやりたいことを正確に行うことはできないと思いますが、Qtのメソッドに基づいて、文字列を自分で簡単に再構築できるはずです(おそらく、元の文字列と100%一致していませんが、同じ意味です)。 XMLクラスが提供します。

編集: そのことを行う可能性のある小さなコードスニペット(テストされていない):

QString domElementToRawXML(const QDomElement& elem)
{
    QString head = "<"+elem.tagName();
    QDomNamedNodeMap attrs = elem.attributes();
    for(int i = 0; i<attrs.size(); ++i)
    {
        QDomAttr attr = attrs.item(i).toAttr();
        head += 
            QString::fromLatin1(" %0=\"%1\"")
            .arg(attr.name())
            .arg(attr.value());
    }
    head += ">";
    return head + elem.text() + "</"+elem.tagName()+">";
}
于 2010-07-14T10:15:58.567 に答える