La conversión de QDomElement a QString / clase de Contenedor
Pregunta
Supongamos que tenemos el siguiente documento XML:
<root>
<options>
...
</options>
<children>
<child name="first">12345</child>
<child name="second">
<additionalInfo>abcd</additionalInfo>
</children>
</root>
Me gustaría obtener una representación de cadena del "niño" nodos y anexar en una matriz (no quiero perder la sintaxis de XML así .texto() no es una opción).Por ejemplo, el primer hijo, se vería así:
QString child = "<child name="first">12345</child>";
He utilizado el siguiente código para obtener los elementos:
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");
}
}
El problema es que el doc.isNull devuelve siempre falso (parece que soy incapaz de convertir el elemento en el documento).Es allí cualquier manera de cómo puedo realizar esto?
Editar:
Me gustaría añadir que QString no es obligatorio aquí.Básicamente cualquier clase que puede ser utilizado más tarde para recuperar los datos es aceptar (voy a guardar estos nodos y los utilizan para inicializar otro de los objetos más adelante).Lo importante es que yo debería ser capaz de acceder a esos valores, incluso cuando el documento original ha sido destruida.Por ejemplo, es posible almacenar los elementos directamente de la matriz (por ejemplo,QList), que puede ser utilizado para acceder a ellos más tarde.
Solución
Añadiré una respuesta a mi propia pregunta.No tengo idea de por qué, pero parece que me perdí la siguiente función en la documentación.
Void Qdomnode :: Guardar (QTextStream y STR, INT SINENTE) CONST
Lo hace prácticamente todo lo que necesito para convertir un nodo en una cadena, por ejemplo:
QString str;
QTextStream stream(&str);
QDomNode node = xml->documentElement().firstChildElement("child");
node.save(stream, 4 /*indent*/);
// process str
Otros consejos
Ya que se necesita el formato XML en sí mismo no necesita QDomElement
o QDomDocument
. QDomElement
y QDomDocument
se utilizan para obtener los datos almacenados en los documentos XML.
Sólo se necesita un archivo ordinario del recorrido.
Abra el archivo con
bool QFile::open ( OpenMode mode ) [virtual]
Usted puede leer el contenido completo del archivo,
QByteArray QIODevice::readAll ()
la que se puede asignar a un QString
.
Por ejemplo,
QString entireContents = xmlFile->readAll();
A continuación, se puede dividir el contenido completo basado en la newline \n
personaje con
QStringList QString::split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
Ahora cada índice corresponde a cada línea en el archivo XML.Que se puede recorrer a través de ella y obtener la deseada líneas de interés.
Espero que ayude...
Puesto, creo que no puede hacer con Excactidad lo que desea con las clases de QT XML, pero debería ser posible reconstruir simplemente la cadena usted mismo (tal vez no coincidir con el original en 100%, pero con el mismo significado), según elMétodos Las clases QT XML proporcionan.
Editar: SNIPPET DE PEQUEÑO CÓDIGO QUE PODRÍA HACER LA COSA (NOTRADA):
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()+">";
}