2010-07-14 8 views
8

Diciamo che abbiamo il seguente documento XML:Conversione QDomElement alla classe QString/contenitore

<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 "figli" e li aggiunge in un array (I don' t voglio perdere la sintassi XML così. text() non è un'opzione). Ad esempio, il primo figlio sarà simile:

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 il doc.isNull restituisce sempre false (sembra che io' m incapace di convertire l'elemento in documento). C'è un modo come posso eseguire questo?

Edit:

vorrei aggiungere che QString non è obbligatoria qui. Fondamentalmente qualsiasi classe che può essere successivamente utilizzata per recuperare i dati è ok (salverò questi nodi e li userò per inizializzare un altro oggetto 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 alcuni array (ad es. QList), che può essere usato per accedervi in ​​seguito.

risposta

12

aggiungerò una risposta alla mia domanda. Non ho idea del perché, ma sembra che abbia perso la seguente funzione nella documentazione.

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

Lo fa praticamente tutto quello che ho bisogno di convertire un nodo in una stringa, per esempio:

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

node.save(stream, QDomNode::CDATASectionNode /* = 4 *); 

// process str 
+1

E l'operazione opposta? Data la stringa generare un QDomNode che può essere successivamente aggiunto ad un QDomDocument esistente? – Pierluigi

+0

@Pierluigi, questa dovrebbe essere una domanda da sola. È abbastanza coinvolto. Si crea un 'QDomDocument', si usa' setContent() ', quindi si usa un' QDomDocumentFragment' per copiare il risultato in un altro documento ... –

+0

Comment/* = 4 * non è chiuso. Quindi qui errore di sintassi. –

0

Poiché è necessario il formato XML stesso, non è necessario QDomElement o QDomDocument. QDomElement e QDomDocument vengono utilizzati per ottenere i dati memorizzati nei documenti XML.

Hai solo bisogno di un normale attraversamento di file.

Aprire il file utilizzando

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

È possibile leggere l'intero contenuto del file,

QByteArray QIODevice::readAll() 

cui è possibile assegnare a un QString.

Per esempio,

QString entireContents = xmlFile->readAll(); 

Quindi è possibile dividere l'intero contenuto basato sul personaggio nuova riga\n utilizzando

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

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

Speranza che aiuta ...

+0

Ty per la risposta. Sto utilizzando le classi QDom * perché ho anche bisogno di analizzare/ottenere molti dati prima dell'operazione discussa. Ecco perché sono curioso di sapere se questo può essere fatto attraverso quelle classi (o qualsiasi classe QtXml). So che è possibile analizzare il documento "a mano" e potrebbe funzionare con un documento semplice. Tuttavia, nella mia situazione il documento potrebbe essere molto complesso e ho bisogno di operazioni simili in più punti. Fondamentalmente tutto quello che so è che dovrebbe esserci un nodo a un certo livello dell'albero XML e ho bisogno di ottenere ogni ramo sotto di esso. – Routa

0

Beh penso che non potete fare esattamente centrale quello che vuoi con le classi XML Qt, ma dovrebbe essere possibile ricostruire semplicemente la stringa da soli (forse non corrispondenti all'originale in 100 %, ma con lo stesso significato), in base ai metodi forniti dalle classi Qt XML.

EDIT: codice piccolo frammento che potrebbe fare la cosa (non testata):

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

Grazie per la risposta. Sulla base di queste risposte sembra che devo abbandonare la strategia di salvare i nodi (come una stringa) e capire qualcos'altro. – Routa