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.

Foi útil?

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()+">";
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top