QString / ContainerクラスにQDomElementを変換する
質問
次の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が必須ではないことを追加したいと思います。基本的にデータを取得するために後で使用できるクラスはOKです(これらのノードを保存し、後でそれらを使用して別のオブジェクトを初期化します)。重要なことは、元の文書が破壊されたときでさえ、私がそれらの値にアクセスできるべきだということです。たとえば、それらの要素をいくつかの配列(例えばqlist)に直接保存することができます。これは後でアクセスするために使用できます。
解決
私自身の質問に答えを追加します。なぜわからないが、ドキュメントで次の機能を逃したように見えます。
void qdomnode :: save(qtextstream&str、intインデント)const
QString str;
QTextStream stream(&str);
QDomNode node = xml->documentElement().firstChildElement("child");
node.save(stream, 4 /*indent*/);
// process str
. 他のヒント
XML形式自体が必要なので、QDomElement
またはQDomDocument
は必要ありません。QDomElement
とQDomDocument
はを使用してXML文書に保存されているデータを取得します。
通常のファイルトラバーサルが必要です。
を使ってファイルを開く
bool QFile::open ( OpenMode mode ) [virtual]
.
ファイルの内容全体を読むことができます。
.
QByteArray QIODevice::readAll ()
QString
に割り当てることができます。
例えば
QString entireContents = xmlFile->readAll();
.
その後、
を使用して、 newline\n
文字に基づいて内容全体を分割できます。
QStringList QString::split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
.
各インデックスはXMLファイルの各行に対応しています。あなたはそれを通過して目的の興味のある線を入手することができます。
それが助けることを願っています...
皆、QT XMLクラスで欲しいものをかわらかくないと思いますが、それに基づいて、自分で文字列を簡単に再構築することはできます(おそらく100%、同じ意味ではありません)。メソッドQT 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()+">";
}
.