comment Ajouter un noeud dans un fichier XML avec QXmlStreamWriter?

J’ai créé un fichier XML avec QXmlStreamWriter, puis je souhaite append un bloc avant de fermer le fichier XML. mais ce que j’essaie de faire est d’append le bloc à la fin du fichier avec un document startDocument. Ainsi, dans chaque ajout, j’ai un en-tête XML. quand il passe au deuxième bloc, il me montre “déclaration xml pas à strat du document” ceci est mon dossier:

   a  b c 11111 F  26 22222     1  7.32896 10.6362 8.96937 9.28687   2.1241   7      2  7.80521 10.3452 9.49854 9.525   1.88152   1     3  6.69396 10.8215 9.26042 9.47208   2.89957   25   

cette méthode est fausse, ce que je veux obtenir est la suivante:

    a  b c 11111 F  26 22222     1  7.32896 10.6362 8.96937 9.28687   2.1241   7    2  7.80521 10.3452 9.49854 9.525   1.88152   1    3  6.69396 10.8215 9.26042 9.47208   2.89957   25    

Lorsque vous voyez , le bloc se répète à chaque ajout de nouveaux parameters. Normalement, ce bloc est ajouté avant le mais je n’ai pas trouvé de moyen avec QXmlStreamWriter (je suis un débutant en xml). J’ai cherché sur le net, je n’ai rien trouvé à ce sujet.

est-ce qu’il existe, s’il vous plaît, une méthode qui ajoute le bloc à chaque fois avant?

Cordialement

Je pense que seul ce hack peut éviter de lire le code XML complet en mémoire et de le réécrire:

  { QSsortingng path("/home/carlo/test/x.xml"); QSsortingng ctag = "\n"; QFile file(path); qint64 s = file.size(); if (s > 0) { file.open(QFile::ReadWrite); if (file.seek(s - ctag.length())) Q_ASSERT(file.pos() == s - ctag.length()); } else file.open(QFile::WriteOnly); QXmlStreamWriter xmlWriter(&file); xmlWriter.setAutoFormatting(true); xmlWriter.setAutoFormattingIndent(2); if (s == 0) { xmlWriter.writeStartDocument(); xmlWriter.writeStartElement("Fiche_Du_Patient"); } xmlWriter.writeStartElement("NUMERO_Patient"); xmlWriter.writeTextElement("Num_Patient", "123"); xmlWriter.writeTextElement("Nom_et_prenom", s > 0 ? "appending" : "creating"); xmlWriter.writeTextElement("Date_de_naissance", s > 0 ? "more date" : "first date"); xmlWriter.writeEndElement(); if (s == 0) { xmlWriter.writeEndElement(); xmlWriter.writeEndDocument(); } else QTextStream(&file) << ctag; } 

cela produit un XML correct, mais le format de sortie n’est pas optimal (l’indentation est perdue). Une meilleure façon d'parsingr la dernière balise, sans codage dur.

Si vous choisissez de continuer avec QXmlStreamReader / Writer, vous aurez besoin des éléments suivants:

  1. Lire le contenu à l’aide de QXmlStreamReader
  2. Tout en écrivant également à QXmlStreamWriter

Vous trouverez ci-dessous un exemple de ce que vous devez faire. N’oubliez pas qu’il existe un certain nombre d’autres cas à vérifier, tels que isComment (), les atsortingbuts de copie , etc.:

 QSsortingng xml = "" "" "1" "2" ""; QSsortingng out; QXmlStreamWriter writer(&out); QXmlStreamReader reader(xml); while(!reader.atEnd()) { if(reader.isStartDocument()) writer.writeStartDocument(); if(reader.isStartElement()) { writer.writeStartElement(reader.name().toSsortingng()); // New elements are appended here if(reader.name() == "data") { writer.writeStartElement("newValue"); writer.writeCharacters("newValue"); writer.writeEndElement(); } } if(reader.isCharacters()) writer.writeCharacters(reader.text().toSsortingng()); if(reader.isEndElement()) writer.writeEndElement(); if(reader.isEndDocument()) writer.writeEndElement(); reader.readNext(); } qDebug() << out; 

La sortie (formatée):

   newValue 1 2