Seite 1 von 1

Xml-Datei lesen

Verfasst: 26. August 2009 21:44
von berti1
Hallo Leute,
So sieht meine Xml-Datei aus

<wurzel>
<person>Hans</person>

</wurzel>
<wurzel>
<person>Schäfer</person>

</wurzel>

Eine Xml-Datei muß nur einen Wurzel haben leider die Xml-Dateien, die
ich bearbeite muß sind sehr groß(über 350MB)und haben keinen eindeutig Wurzel. Aus diesem habe ich mich diesen Algorithmus überlegen.

QFile file = new file("/../xmlbeispiel.xml");
QXmlStreamReader xml;

QByteArray anfang("<xmlFile>"), ende("</xmlFile>");

xml.addData(anfang);

//Mit dieser Methode kann ich die Xml-Dateien lesen aber es dauer ewig
//außerdem sie ist nicht flexibel, da ich die Größe der Dateien schon //fest muss. Welche alternativ gibts dann an dieser Stelle.
xml.addData(file->read(350000000));

xml.addData(ende);

while (!xml.atEnd() && !xml.hasError()){
------------------------
}

Hat jemand einen effiktiv algorithmus oder meinen verbessern?

Danke

Verfasst: 27. August 2009 08:04
von NoRulez
Du könntest stattdessen QXmlStreamReader verwenden.

LG NoRulez

Verfasst: 27. August 2009 08:13
von berti1
NoRulez hat geschrieben:Du könntest stattdessen QXmlStreamReader verwenden.

LG NoRulez
Ich habe doch QXmlStreamReader verwendet.

Verfasst: 27. August 2009 08:57
von NoRulez
Sorry, hatte ich überlesen, mein Fehler.

Vielleicht hilft Dir ja folgender Codeausschnitt:

Code: Alles auswählen

QXmlStreamReader m_xml;
QString m_currentTag;
QString m_linkString;
QString m_descriptionString;
QString m_titleString;
int m_items;
int m_maxItems;

Code: Alles auswählen

    while (!m_xml.atEnd()) {
        m_xml.readNext();
        if (m_xml.isStartElement()) {
            if (m_xml.name() == "item") {
                m_titleString.clear();
                m_descriptionString.clear();
                m_linkString.clear();
            }
            m_currentTag = m_xml.name().toString();
        } else if (m_xml.isEndElement()) {
            if (m_xml.name() == "item") {
                m_items++;
                if (m_items > m_maxItems)
                    return;
                emit newsItemReady(m_titleString, m_descriptionString, m_linkString);
            }

        } else if (m_xml.isCharacters() && !m_xml.isWhitespace()) {
            if (m_currentTag == "title")
                m_titleString += m_xml.text().toString();
            else if (m_currentTag == "description")
                m_descriptionString += m_xml.text().toString();
            else if (m_currentTag == "link")
                m_linkString += m_xml.text().toString();
        }
    }
    if (m_xml.error() && m_xml.error() != QXmlStreamReader::PrematureEndOfDocumentError) {
        qWarning() << "XML ERROR:" << m_xml.lineNumber() << ": " << m_xml.errorString();
        m_http.abort();
    }
LG NoRulez