Conversione di QDomElement in QString/classe contenitore
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.
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()+">";
}