Jan Królikowski

Jan Królikowski QA Auditor & Team
Leader

Temat: Wyciąganie tekstu childnode'a z QXmlItem

zasadniczo sprawa wygląda następująco:
za pomocą QXmlQuery i QXmlItem z pliku structure.xml staram się wyodrębnić element x, a następnie z niego element nam.

Fragment pliku structure.xml:


<!DOCTYPE structure>
<data>
<x>
<id>1</id>
<nam>tytuł</nam>
<tab>21</tab>
<ind>5</ind>
<pre>TY</pre>
<khw>C.TY</khw>
</x>
<x>
<id>2</id>
<nam>autor</nam>
<tab>21</tab>
<ind>5</ind>
<pre>FO</pre>
<khw>C.FO</khw>
</x>
<x>
<id>3</id>
<nam>hasło korporatywne</nam>
<tab>21</tab>
<ind>5</ind>
<pre>FN</pre>
<khw>C.FN</khw>
</x>
</data>


i kod programu:

QXmlResultItems results;
QFile structure("./structure.xml");
structure.open(QFile::ReadOnly);

QXmlQuery query;
query.setFocus(&structure);
query.setQuery("data/x");
query.evaluateTo(&results);

QXmlItem next = results.next();
while(!next.isNull()) {
QXmlQuery childQuery;
QString r;
childQuery.setFocus(next);
childQuery.setQuery("./nam/text()");
childQuery.evaluateTo(&r);
qDebug() << r; // zwraca pusty napis, a powinien zawierać zawartość elementu <nam>

next = results.next();
}


gdzie robię błąd? Wersja Qt: 4.7.2
Jan Królikowski

Jan Królikowski QA Auditor & Team
Leader

Temat: Wyciąganie tekstu childnode'a z QXmlItem

Ach te tematy dodawane późną nocą. W swoim poście nie umieściłem informacji, że chciałbym również wyciągnąć zawartość elementów <id> oraz <pre>. Gdybym potrzebował samo <nam> to sprawa by się uprościła, wyciągnąłbym jednym zapytaniem. Rzecz opiera się na użyciu QXmlItem jako focusa dla QXmlQuery, które albo nie działa, albo robię coś źle.

konto usunięte

Temat: Wyciąganie tekstu childnode'a z QXmlItem

Podoba mnie się problem ;) jak wrócę do domu z pracy i jeszcze Ci nikt nie pomoże postaram się Ci pomóc ;)
Pozdrawiam.
Jan Królikowski

Jan Królikowski QA Auditor & Team
Leader

Temat: Wyciąganie tekstu childnode'a z QXmlItem

Przemek Czekaj:
Podoba mnie się problem ;) jak wrócę do domu z pracy i jeszcze Ci nikt nie pomoże postaram się Ci pomóc ;)
Pozdrawiam.

dzięki z góry. Co do drugiego zapytanie próbowałem już "./nam/string()", "nam/string()", "x/nam/string()", "data/x/nam/string()" i wszystkie wyrzucały nie tyle pusty napis, co \n

próbowałem też zamiast QStringa użyć QXmlResultItems próbując wyciągnąć je poprzez metody .toNodeModelIndex().stringValue() jak i .toAtomicValue() - nadal nic.

konto usunięte

Temat: Wyciąganie tekstu childnode'a z QXmlItem

Męczę się od godziny i nie mam pojęcia jak to zrobić :D
A w php to 5 linijek kodu xD
Jan Królikowski

Jan Królikowski QA Auditor & Team
Leader

Temat: Wyciąganie tekstu childnode'a z QXmlItem

Przemek Czekaj:
Męczę się od godziny i nie mam pojęcia jak to zrobić :D
A w php to 5 linijek kodu xD

ano, nawet w PHP ;]. Strzelałbym, że moja sytuacja to efekt jakiegoś buga lub niedokończonej funkcjonalności (patrząc na testy tej klasy wychodzi na to, że nawet nie jest do końca przetestowana: http://qt.gitorious.org/qt/qt/blobs/4.7/tests/auto/qxm... ). Ja koniec końców przyglądam się rozwiązaniu opierającym się na QAbstractXmlReceiver, który będzie produkować dla mnie obiekty żądanego typu z parsowanego XMLa (co nie zmienia faktu, że to dość mocne zawracanie ...)

konto usunięte

Temat: Wyciąganie tekstu childnode'a z QXmlItem

to żeby było śmieszniej zamień znacznik <nam> w pliku na <name> i query "./name/text()".. działa :P a właściwie prawie, bo zwraca "tytuł\n" zamiast "tytuł"
Coś jest zdecydowanie nie tak z tym modułem..

konto usunięte

Temat: Wyciąganie tekstu childnode'a z QXmlItem


bool czytajTegoXMLa(QIODevice *device) {
QXmlStreamReader xml;
xml.setDevice(device);
QString currentElem, currentTag;
while (!xml.atEnd()) {
xml.readNext();
if (xml.isStartElement()) {
if (xml.name() == "x") {
currentElem = "x";
qDebug() << "Jestesmy w x!";
}
} else if (xml.isEndElement()) {
if (xml.name() == "x") {
currentElem = "";
qDebug() << "A teraz na koncu x!";
}
} else if (xml.isCharacters() && !xml.isWhitespace()) {
qDebug() << xml.text().toString();
}
}
if (xml.error() && xml.error() != QXmlStreamReader::PrematureEndOfDocumentError) {
qWarning() << "XML ERROR:" << xml.lineNumber() << ": " << xml.errorString();
}

return !xml.error();
}

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QFile file("./test.xml");

if (!file.open(QFile::ReadOnly | QFile::Text)) {
qDebug() << "Nie można odczytać";
return 1;
}
czytajTegoXMLa(&file);

return 0;
}


Ale nie potrafię wyciągnąć z drzewa x poszczególnych nazw elementów, nie wiem jak to zrobić ;/

konto usunięte

Temat: Wyciąganie tekstu childnode'a z QXmlItem

Jan Królikowski:

http://qt.gitorious.org/qt/qt/blobs/4.7/tests/auto/qxm... ). Ja koniec końców przyglądam się rozwiązaniu opierającym się na QAbstractXmlReceiver, który będzie produkować dla mnie obiekty żądanego typu z parsowanego XMLa (co nie zmienia faktu, że to dość mocne zawracanie ...)

Haha zrobiłem ;p


bool czytajTegoXMLa(QIODevice *device) {
QXmlStreamReader xml;
xml.setDevice(device);
QString currentTag;
while (!xml.atEnd()) {
xml.readNext();
if (xml.isStartElement()) {
if(xml.name() == "nam") {
currentTag = "nam";
qDebug() << "jestesmy w nam";
} else {
currentTag = "";
}
} else if (xml.isEndElement()) {
if (xml.name() == "nam") {
currentTag = "";
qDebug() << "koniec nam!";
}
} else if (xml.isCharacters() && !xml.isWhitespace() && currentTag == "nam") {
qDebug() << xml.text().toString();
}
}
if (xml.error() && xml.error() != QXmlStreamReader::PrematureEndOfDocumentError) {
qWarning() << "XML ERROR:" << xml.lineNumber() << ": " << xml.errorString();
}

return !xml.error();
}
Jan Królikowski

Jan Królikowski QA Auditor & Team
Leader

Temat: Wyciąganie tekstu childnode'a z QXmlItem

Przemek Czekaj:

Haha zrobiłem ;p
rzeczą, którą chciałem uniknąć to własnie iterowanie po wszystkich elementach. Na tą chwilę zarówno rozwiązanie przez QAbstractXmlReceiver jak i Twoje opiera się na ciągłym iterowaniu przez kolejne elementy. No nic, na razie zostaję przy QAbstractXmlReceiver. Nie ma dla C++/Qt jakiegoś odpowiednika jQuery selectorów? Jest PyQuery dla pythona, Hpricot dla Ruby, Fizzler dla C#... jako człowieka z webdevelopmentu ułatwiłoby znacznie ułatwiło by mi to pracę :P
Tomasz M.

Tomasz M. never go full
retard!

Temat: Wyciąganie tekstu childnode'a z QXmlItem

Jan Królikowski:
Przemek Czekaj:

Haha zrobiłem ;p
rzeczą, którą chciałem uniknąć to własnie iterowanie po wszystkich elementach. Na tą chwilę zarówno rozwiązanie przez QAbstractXmlReceiver jak i Twoje opiera się na ciągłym iterowaniu przez kolejne elementy. No nic, na razie zostaję przy QAbstractXmlReceiver. Nie ma dla C++/Qt jakiegoś odpowiednika jQuery selectorów? Jest PyQuery dla pythona, Hpricot dla Ruby, Fizzler dla C#... jako człowieka z webdevelopmentu ułatwiłoby znacznie ułatwiło by mi to pracę :P

ale że co? biblioteka do łażenia po xmlach? w zasadzie to większość jest w C napisana, choćby pierwsze z brzegu...

http://expat.sourceforge.net/
http://www.minixml.org/
http://xmlsoft.org/
http://xerces.apache.org/xerces-c/

konto usunięte

Temat: Wyciąganie tekstu childnode'a z QXmlItem

Ja się ciesze że tego nie trzeba było zrobić rekurencyjnie.

konto usunięte

Temat: Wyciąganie tekstu childnode'a z QXmlItem

QDomDocument na przyszłość polecam ;)



Wyślij zaproszenie do