A conversão de QDomElement para QString / classe de Contêiner
Pergunta
Suponhamos que temos o seguinte documento XML:
<root>
<options>
...
</options>
<children>
<child name="first">12345</child>
<child name="second">
<additionalInfo>abcd</additionalInfo>
</children>
</root>
Eu gostaria de obter uma representação de seqüência de caracteres da "criança" nós e acrescentá-los em uma matriz (eu não quero perder a sintaxe de XML isso .texto() não é uma opção).Por exemplo, o primeiro filho seria parecido com:
QString child = "<child name="first">12345</child>";
Eu usei o seguinte código para obter os 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");
}
}
O problema é que o doc.isNull retorna sempre falsa (olha como eu sou incapaz de converter-se o elemento no documento).Existe alguma maneira de como eu posso realizar isso?
Editar:
Eu gostaria de adicionar que QString não é obrigatório aqui.Basicamente, qualquer classe que pode mais tarde ser usado para recuperar os dados é ok (eu vou guardar esses nós e usá-los para iniciar outra objetos mais tarde).A coisa importante é que eu deveria ser capaz de aceder a esses valores, mesmo quando o documento original ter sido destruído.Por exemplo, é possível armazenar os elementos diretamente para alguma matriz (por exemplo,QList), que pode ser usado para acessá-los mais tarde.
Solução
Eu vou adicionar uma resposta para minha pergunta.Nenhuma idéia de por que, mas parece que eu perdi a seguinte função na documentação.
void QDomNode::save ( QTextStream & str, int travessão ) const
Ele faz praticamente tudo o que eu preciso para converter um nó em uma seqüência de caracteres, e.g:
QString str;
QTextStream stream(&str);
QDomNode node = xml->documentElement().firstChildElement("child");
node.save(stream, 4 /*indent*/);
// process str
Outras dicas
Pois é, o formato XML em si, você não precisa QDomElement
ou QDomDocument
. QDomElement
e QDomDocument
são utilizados para obter os dados armazenados nos documentos XML.
Você só precisa de um arquivo comum transversal.
Abra o arquivo usando
bool QFile::open ( OpenMode mode ) [virtual]
Você pode ler o conteúdo inteiro do arquivo,
QByteArray QIODevice::readAll ()
o que você pode atribuí-lo a um QString
.
Por exemplo,
QString entireContents = xmlFile->readAll();
Em seguida, você pode dividir todo o conteúdo, com base no nova linha \n
personagem usando
QStringList QString::split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
Agora cada índice corresponde a cada linha do arquivo XML.Você pode percorrer-lo e obter o desejado de linhas de interesse.
Espero que ajude...
Bem, eu acho que você não pode fazer excactly o que você quer com o Qt classes XML, mas deve ser possível simplesmente reconstruir a seqüência de caracteres de si mesmo (talvez não corresponde ao original em 100%, mas com o mesmo significado), com base nos métodos de Qt classes XML fornecer.
EDITAR: Pequeno trecho de código que pode fazer a coisa (não testado):
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()+">";
}