Domanda

Supponiamo di avere il seguente documento XML:

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

Vorrei ottenere una rappresentazione di stringa dei nodi "figlio" e aggiungerli in un array (non voglio perdere la sintassi XML quindi .text() non è un'opzione).Ad esempio, il primo figlio sarebbe simile a:

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

Ho usato il seguente codice per ottenere gli elementi:

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");
    }
}

Il problema è che doc.isNull restituisce sempre false (sembra che non riesca a convertire l'elemento in document).C'è un modo per eseguire questa operazione?

Modificare:

Vorrei aggiungere che QString non è obbligatorio qui.Fondamentalmente qualsiasi classe che può essere utilizzata in seguito per recuperare i dati è ok (salverò questi nodi e li userò per inizializzare altri oggetti in seguito).La cosa importante è che dovrei essere in grado di accedere a quei valori anche quando il documento originale è stato distrutto. Ad esempio, è possibile memorizzare quegli elementi direttamente in qualche array (ad es.QList), che può essere utilizzato per accedervi in ​​seguito.

È stato utile?

Soluzione

Aggiungerò una risposta alla mia stessa domanda.Non ho idea del perché, ma sembra che mi sia sfuggita la seguente funzione nella documentazione.

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

Fa praticamente tutto ciò di cui ho bisogno per convertire un nodo in una stringa, ad esempio:

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

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

// process str

Altri suggerimenti

Poiché hai bisogno del formato XML stesso, non ti serve QDomElement O QDomDocument. QDomElement E QDomDocument sono usati per ottenere i dati memorizzati nei documenti XML.

Hai solo bisogno di un normale attraversamento dei file.

Apri il file utilizzando

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

È possibile leggere l'intero contenuto del file tramite,

QByteArray QIODevice::readAll ()

a cui puoi assegnarlo a un QString.

Per es.

QString entireContents = xmlFile->readAll();

Quindi puoi dividere l'intero contenuto in base al file nuova linea \n carattere utilizzando

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

Ora ciascun indice corrisponde a ciascuna riga nel file XML.Puoi attraversarlo e ottenere le linee di interesse desiderate.

Spero che sia d'aiuto...

Beh, penso che non puoi fare esattamente quello che vuoi con le classi Qt XML, ma dovrebbe essere possibile semplicemente ricostruire tu stesso la stringa (magari non corrispondente all'originale al 100%, ma con lo stesso significato), in base ai metodi Qt Le classi XML forniscono.

MODIFICARE:Piccolo frammento di codice che potrebbe fare la cosa (non testato):

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()+">";
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top