1

QXmlStreamWriter で xml ファイルを作成し、xml ファイルを閉じる前に毎回ブロックを追加したいと考えています。しかし、私がやろうとしているのは、startDocument を使用してファイルの最後にブロックを追加することです。そのため、追加するたびに XML ヘッダーがあります。このため、ドキュメントの読み取り中にエラーが発生し、プログラムは最初のブロックを読み取り、 2番目のブロックに移動すると、「ドキュメントのストラトにないxml宣言」が表示されます。これは私のファイルです:

<?xml version="1.0" encoding="UTF-8"?>
<Fiche_Du_Patient>
<INFORMATIONS_DU_PATIENT>
 <Hopital>a </Hopital>
  <Num_dossier>b</Num_dossier>
  <Nom_et_prenom>c</Nom_et_prenom>
  <Date_de_naissance>11111</Date_de_naissance>
  <Sex>F </Sex>
  <Age>26</Age>
  <Date_examen>22222</Date_examen>
  <Medecin_traitant></Medecin_traitant>
  <Rapport></Rapport>
</INFORMATIONS_DU_PATIENT>
<NUMERO_SLICE>
  <Num_Slice>1</Num_Slice>
   <COORDONEES>
    <X1>7.32896</X1>
    <Y1>10.6362</Y1>
    <X2>8.96937</X2>
    <Y2>9.28687</Y2>
  </COORDONEES>
  <DISTANCE>
   <Distance_en_cm>2.1241</Distance_en_cm>
  </DISTANCE>
  <ANGLE>
   <Angle>7</Angle>
  </ANGLE>
 </NUMERO_SLICE>
</Fiche_Du_Patient>
<?xml version="1.0" encoding="UTF-8"?>
  <NUMERO_SLICE>
   <Num_Slice>2</Num_Slice>
    <COORDONEES>
     <X1>7.80521</X1>
     <Y1>10.3452</Y1>
     <X2>9.49854</X2>
     <Y2>9.525</Y2>
   </COORDONEES>
   <DISTANCE>
   <Distance_en_cm>1.88152</Distance_en_cm>
   </DISTANCE>
   <ANGLE>
    <Angle>1</Angle>
   </ANGLE>
 </NUMERO_SLICE>
<?xml version="1.0" encoding="UTF-8"?>
  <NUMERO_SLICE>
   <Num_Slice>3</Num_Slice>
    <COORDONEES>
     <X1>6.69396</X1>
     <Y1>10.8215</Y1>
     <X2>9.26042</X2>
     <Y2>9.47208</Y2>
    </COORDONEES>
    <DISTANCE>
     <Distance_en_cm>2.89957</Distance_en_cm>
    </DISTANCE>
    <ANGLE>
     <Angle>25</Angle>
    </ANGLE>
  </NUMERO_SLICE>

このメソッドは false です。取得したいのは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<Fiche_Du_Patient>
<INFORMATIONS_DU_PATIENT>
    <Hopital>a </Hopital>
    <Num_dossier>b</Num_dossier>
    <Nom_et_prenom>c</Nom_et_prenom>
    <Date_de_naissance>11111</Date_de_naissance>
    <Sex>F </Sex>
    <Age>26</Age>
    <Date_examen>22222</Date_examen>
    <Medecin_traitant></Medecin_traitant>
    <Rapport></Rapport>
</INFORMATIONS_DU_PATIENT>
<NUMERO_SLICE>
    <Num_Slice>1</Num_Slice>
    <COORDONEES>
        <X1>7.32896</X1>
        <Y1>10.6362</Y1>
        <X2>8.96937</X2>
        <Y2>9.28687</Y2>
    </COORDONEES>
    <DISTANCE>
        <Distance_en_cm>2.1241</Distance_en_cm>
    </DISTANCE>
    <ANGLE>
        <Angle>7</Angle>
    </ANGLE>
</NUMERO_SLICE>
<NUMERO_SLICE>
<Num_Slice>2</Num_Slice>
<COORDONEES>
  <X1>7.80521</X1>
  <Y1>10.3452</Y1>
  <X2>9.49854</X2>
  <Y2>9.525</Y2>
</COORDONEES>
<DISTANCE>
  <Distance_en_cm>1.88152</Distance_en_cm>
</DISTANCE>
<ANGLE>
  <Angle>1</Angle>
</ANGLE>
</NUMERO_SLICE>
 <NUMERO_SLICE>
 <Num_Slice>3</Num_Slice>
<COORDONEES>
  <X1>6.69396</X1>
  <Y1>10.8215</Y1>
  <X2>9.26042</X2>
  <Y2>9.47208</Y2>
</COORDONEES>
<DISTANCE>
  <Distance_en_cm>2.89957</Distance_en_cm>
</DISTANCE>
<ANGLE>
  <Angle>25</Angle>
</ANGLE>
</NUMERO_SLICE>
</Fiche_Du_Patient>

ご覧のとおり、< NUMERO_SLICE > ブロックは、新しいパラメーターが追加されるたびに繰り返されます。通常、このブロックは </ Fiche_Du_Patient> の前に追加されますが、QXmlStreamWriter を使用する方法が見つかりませんでした (私は xml の初心者です) ネットを検索しましたが、これについては何も見つかりませんでした。

<NUMERO_SLICE>ブロックを毎回前に追加する方法はありますか?

心から

4

2 に答える 2

0

QXmlStreamReader/Writer を使用して続行する場合は、次のものが必要です。

  1. QXmlStreamReader を使用してコンテンツを読み取る
  2. また、QXmlStreamWriter に書き出す間

以下は、あなたがする必要がある場合の例です。isComment() やattributes のコピーなど、他にもチェックすべきケースがいくつかあることに注意してください。

QString xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
              "<data>"
                "<value>1</value>"
                "<value>2</value>"
              "</data>";

QString out;
QXmlStreamWriter writer(&out);

QXmlStreamReader reader(xml);
while(!reader.atEnd())
{
  if(reader.isStartDocument())
    writer.writeStartDocument();

  if(reader.isStartElement())
  {
    writer.writeStartElement(reader.name().toString());

    // New elements are appended here
    if(reader.name() == "data")
    {
      writer.writeStartElement("newValue");
      writer.writeCharacters("newValue");
      writer.writeEndElement();
    }
  }

  if(reader.isCharacters())
    writer.writeCharacters(reader.text().toString());

  if(reader.isEndElement())
    writer.writeEndElement();

  if(reader.isEndDocument())
    writer.writeEndElement();

  reader.readNext();
}

qDebug() << out;

出力 (フォーマット済み):

<?xml version="1.0"?>
<data>
  <newValue>newValue</newValue>
  <value>1</value>
  <value>2</value>
</data>
于 2013-06-19T17:00:28.500 に答える