2017-03-27 21 views
0

私はアプリケーションが生成しようとしているXMLをいくつか持っています。この例では、</element>タグから "value"という値を解析しようとしていますが、QXmlStreamReaderは<value/>の後に何かを読み込もうとしていますが、 "<value/>"QXmlStreamReaderの読み取り<element><value/></element>

ソースXMLが正しくないか、QXmlStreamReaderからこの値を取得する方法がありますか?

QString str = "<element><value/></element>"; 

QXmlStreamReader xml(str); 
while (!xml.atEnd()) { 
    xml.readNext(); 
    qDebug() << xml.name() << xml.readElementText(); 
} 

if (xml.hasError()) { 
    // Prints "Expected character data. 17" 
    qDebug() << xml.errorString() << xml.characterOffset(); 
} 

誰にも提案はありますか?

+1

あなたのXMLが正しく形成されています。 QXmlStreamReaderを使用しているので、Qt 4.8を使用していると仮定します。あなたが[この質問への受け入れられた答え](http://stackoverflow.com/questions/4201175/why-cant-i-parse-a-xml-file-using-qxmlstreamreader-from-qt)を見れば、それはXMLパーサーはやや奇妙な振る舞いをしていますか? –

+1

xmlに要素の値はありません。あなたは何を解析したいですか?また、現在の要素が開始要素の場合は、値を読み取る必要があります。したがって、あなたのコードに 'if(xml.isStartElement())...'を追加してください。 – vahancho

答えて

0

xml.text()の使用に関するMrEricSirの答えを読んだ後、空の文字列が返ってきたことに気がついたので、もう少し掘り下げました。私は、xml.readNext()の後にxml.name()が即座に "要素"の中に、空の文字列(StartElementの場合は 'value'、EndElementの場合は ')のために探していたものを返しました。 if (xml.isStartElement())についてのvahanchoのコメントがありませんでしたので、「価値」だけを返すように絞り込んでくれました。ここをクリックしてください:

QString str = "<element><value/></element>"; 

QXmlStreamReader xml(str); 
while (!xml.atEnd()) { 
    xml.readNext(); 
    if (xml.name() == "element") { 
     xml.readNext(); 
     if (xml.isStartElement()) 
      qDebug() << xml.name(); 
    } 
} 

if (xml.hasError()) { 
    qDebug() << xml.errorString() << xml.characterOffset(); 
} 
0

私はQt 5.5を使ってこれを再現することができますが、ここでの問題は、読むべきテキストがないときにQXmlStreamReader::readElementText()を使用していることです。この関数のドキュメントは、要素が開始要素と終了要素の両方の場合のnot very clear currentlyです。

StartElementを読み込んだ場合に呼び出される便利な関数です。 対応するEndElementまで読み取り、すべてのテキスト を中間に返します。エラーがない場合、この関数を呼び出した後の現在のトークン(tokenType()参照) はEndElementです。

この関数は、Charactersまたは EntityReferenceトークンのいずれかを読み込み、ProcessingInstructionおよびCommentをスキップしてtext()を連結します。 現在のトークンがStartElementでない場合、空の文字列が返されます。

この動作では、EndElementに到達する前に他のものが読み取られた場合の処理​​を定義します。 この関数には、 子要素のテキスト(HTMLの場合など)、子要素の無視、 、またはUnexpectedElementErrorを発生させ、これまでに読み取った内容を (デフォルト)に戻すことができます。

この関数はQt 4.6で導入されました。

あなたは何をしていますか?私は単純にQXmlStreamReader::text()を使用することをお勧めします。これはサンプルコードで正常に動作します。

+0

QXmlStreamReader :: text()が私のために空の文字列を返しました。しかし、QXmlStreamReader :: name()の中で "element"が 'value'を返しました。私の答えを見てください。 – ComputerEngineer88

+0

@ ComputerEngineer88 'value'要素のテキストは明らかにありません。なぜあなたはそれが何かを返すと思いますか? – MrEricSir

+0

それはあなたの提案でした... – ComputerEngineer88

関連する問題