QDOM- XML Datei erstellen - Zeilen einrücken

Alles rund um die Programmierung mit Qt
Antworten
Stacked
Beiträge: 5
Registriert: 18. Juli 2011 08:26

QDOM- XML Datei erstellen - Zeilen einrücken

Beitrag von Stacked »

Guten Tag,
bin noch neu in der Welt von C++/Qt und habe eine hoffentlich einfache Frage an euch.

Ich möchte eine XML Datei erstellen, in der Konfigurationsparameter abgespeichert werden.
Das klappt auch soweit ganz gut, nur habe ich noch 2 Probleme mit der Formatierung.

Die XML Datei sieht zur Zeit so aus:

Code: Alles auswählen

<!DOCTYPE Konfigurationsdatei des Trace Service>
<traceCaptureSetup>
 <collectionSettings atCapacity="discard" powerOnStart="false" timeLimit="30.00000" appendData="false" deferOffload="true" endless="false" capacity="60000" autoRestart="false" />
 <sessionSettings clientPrivilegeRead="password" clientPrivilegeManage="exclusive" archiveSetting="NCU" expirationPeriod="0" sessionName="SampleSession" />
 <sampleRateSettings servoSampleRate=".002" ipo2SampleRate=".008" ipo1SampleRate=".008" />
 <signal eventChannel="1" domain="NCU_1" event="1" description="Position, Sollwert X-Achse" displayRes="5" key="s1" dataType="double" unitsType="none" name="+/Channel/MachineAxis/cmdContrPos[u1, 1]" />
 <signal eventChannel="1" domain="NCU_1" event="1" description="R parameter (from SW 3.3):Ch1[1]" displayRes="5" key="s2" dataType="double" unitsType="none" name="+/Channel/!RP/rpa[u1, 2]" />
</traceCaptureSetup>
Die Datei soll so aussehen:

Code: Alles auswählen

<traceCaptureSetup>
 <collectionSettings atCapacity="discard" powerOnStart="false" timeLimit="30.00000" appendData="false" deferOffload="true" endless="false" capacity="60000" autoRestart="false" />
 <sessionSettings clientPrivilegeRead="password" clientPrivilegeManage="exclusive" archiveSetting="NCU" expirationPeriod="0" sessionName="SampleSession" />
 <sampleRateSettings servoSampleRate=".002" ipo2SampleRate=".008" ipo1SampleRate=".008" />
<signalSettings>
 <signal eventChannel="1" domain="NCU_1" event="1" description="Position, Sollwert X-Achse" displayRes="5" key="s1" dataType="double" unitsType="none" name="+/Channel/MachineAxis/cmdContrPos[u1, 1]" />
 <signal eventChannel="1" domain="NCU_1" event="1" description="R parameter (from SW 3.3):Ch1[1]" displayRes="5" key="s2" dataType="double" unitsType="none" name="+/Channel/!RP/rpa[u1, 2]" />
</signalSettings></traceCaptureSetup>
Änderungen:
- Die erste Zeile soll in der fertigen Datei nicht enthalten sein (!Doctype ...), wie verhindert man dessen Erstellung?
- Die beiden "signal" sollen ein Unterpunkt von "signalSettings" sein

Der Code:

Code: Alles auswählen

//////////////////////////////////////////////////////////////////////////////
	traceCalibrationa ca;						// trace Calibration Objekte
	traceCalibrationb cb;
	traceCalibrationc cc;
	traceCalibrationd cd;
	// Gehört zum Test (siehe Unten)
	QDomElement ContactToNode1( QDomDocument &d, const traceCalibrationa &ca ) //, const traceCalibrationb &cb )
	{
		QDomElement cn = d.createElement( "collectionSettings" );
		cn.setAttribute( "appendData", ca.appendData );
		cn.setAttribute( "endless", ca.endless );
		cn.setAttribute( "atCapacity", ca.atCapacity );
		cn.setAttribute( "autoRestart", ca.autoRestart );
		cn.setAttribute( "capacity", ca.capacity );
		cn.setAttribute( "powerOnStart", ca.powerOnStart );
		cn.setAttribute( "timeLimit", ca.timeLimit );
		cn.setAttribute( "deferOffload", ca.deferOffload );
		return cn;
	} 

	QDomElement ContactToNode2( QDomDocument &d, const traceCalibrationb &cb )
	{
		QDomElement cn = d.createElement( "sessionSettings" );
		cn.setAttribute( "sessionName", cb.sessionName );
		cn.setAttribute( "archiveSetting", cb.archiveSetting );
		cn.setAttribute( "clientPrivilegeRead", cb.clientPrivilegeRead );
		cn.setAttribute( "clientPrivilegeManage", cb.clientPrivilegeManage );
		cn.setAttribute( "expirationPeriod", cb.expirationPeriod);
		return cn;
	}
	
	QDomElement ContactToNode3( QDomDocument &d, const traceCalibrationc &cc )
	{
		QDomElement cn = d.createElement( "sampleRateSettings" );
		cn.setAttribute( "ipo1SampleRate", cc.ipo1SampleRate );
		cn.setAttribute( "ipo2SampleRate", cc.ipo2SampleRate );
		cn.setAttribute( "servoSampleRate", cc.servoSampleRate );
		return cn;
	}

	QDomElement ContactToNode4( QDomDocument &d, const traceCalibrationd &cd )
	{
		QDomElement cn = d.createElement( "signal" );

		cn.setAttribute( "key", cd.key);
		cn.setAttribute( "domain" , cd.domain);
		cn.setAttribute( "event", cd.eventc );
		cn.setAttribute( "eventChannel", cd.eventChannel);
		cn.setAttribute( "name", cd.name );
		cn.setAttribute( "description", cd.description);
		cn.setAttribute( "dataType", cd.dataType);
		cn.setAttribute( "unitsType", cd.unitsType);
		cn.setAttribute( "displayRes", cd.displayRes);
		return cn;
	}

//////////////////////////////////////////////////////////////////////////
// Schreiben einer XMl Datei
////////////////////////////////////////////
bool kennlinie_form1::writeXml2()
{
	QDomDocument doc( "Konfigurationsdatei des Trace Service" );

	// <traceCaptureSetup>
	QDomElement root = doc.createElement( "traceCaptureSetup" );

	doc.appendChild( root );
	ca.appendData = "false";
	ca.endless = "false";
	ca.atCapacity = "discard";
	ca.autoRestart = "false";
	ca.capacity = "60000";
	ca.powerOnStart = "false";
	ca.timeLimit = "30.00000";
	ca.deferOffload = "true";
	root.appendChild( ContactToNode1 ( doc, ca ) );

	doc.appendChild ( root );
	cb.sessionName = "SampleSession";
	cb.archiveSetting = "NCU";
	cb.clientPrivilegeRead = "password";
	cb.clientPrivilegeManage = "exclusive";
	cb.expirationPeriod = "0";
	root.appendChild( ContactToNode2( doc, cb ) );

	doc.appendChild ( root );
	cc.ipo1SampleRate = ".008";
	cc.ipo2SampleRate = ".008";
	cc.servoSampleRate = ".002";
	root.appendChild( ContactToNode3( doc, cc) );

	doc.appendChild (root);
	cd.key = "s1";
	cd.domain = "NCU_1";
	cd.eventc = "1";
	cd.eventChannel = "1";
	cd.name = "+/Channel/MachineAxis/cmdContrPos[u1, 1]";
	cd.description = "Position, Sollwert X-Achse";
	cd.dataType = "double";
	cd.unitsType = "none";
	cd.displayRes = "5";
	root.appendChild( ContactToNode4( doc, cd) );

	doc.appendChild (root);
	cd.key = "s2";
	cd.domain = "NCU_1";
	cd.eventc = "1";
	cd.eventChannel = "1";
	cd.name = "+/Channel/!RP/rpa[u1, 2]";
	cd.description = "R parameter (from SW 3.3):Ch1[1]";
	cd.dataType = "double";
	cd.unitsType = "none";
	cd.displayRes = "5";
	root.appendChild( ContactToNode4( doc, cd) );

	//doc.appendChild (root);
	QFile file( "/hmisl/oem/sinumerik/hmi/data/schreiben.xml" );			// Pfad angeben
	if( !file.open( QIODevice::WriteOnly ) )								// Datei erstellen 
	return 1;

	QTextStream ts( &file );												// In Datei schreiben
	ts << doc.toString();

	file.close();

	return 0;
	//return false;

} // <-- bool kennlinie_form1::writeXml2()
Bin für jede Hilfe dankbar.
Gruß, Stacked
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QDOM- XML Datei erstellen - Zeilen einrücken

Beitrag von Christian81 »

Wie eine xml-Datei aussieht ist eigentlich total egal. Sie ist nicht für menschliche Augen bestimmt...
Trotzdem hat Qt eine Funktion für. Einfach mal die Doku zu der von Dir schon verwendeten toString() - Methode lesen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Stacked
Beiträge: 5
Registriert: 18. Juli 2011 08:26

Re: QDOM- XML Datei erstellen - Zeilen einrücken

Beitrag von Stacked »

Ok schlecht beschrieben.

Es geht mir nicht um das einrücken, sondern darum das <signal> ein Unterpunkt (?, child?) von <signalsettings> wird.
In etwa so:
<signalSettings>
<signal.....>
<signal...>
</signalSettings>

Durch doc.appendChild ( root ); funktioniert das zumindest für eine Ebene. Was aber wenn man noch tiefer geher will?
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Re: QDOM- XML Datei erstellen - Zeilen einrücken

Beitrag von archer »

Steht doch alles in der Doku

Code: Alles auswählen

 QDomDocument doc("MyDoc");
 QDomElement root = doc.createElement("Root");
 doc.appendChild(root);

 QDomElement child = doc.createElement("Child");
 root.appendChild(child);
Stacked
Beiträge: 5
Registriert: 18. Juli 2011 08:26

Re: QDOM- XML Datei erstellen - Zeilen einrücken

Beitrag von Stacked »

Jep, das habe ich auch soweit verstanden. Um bei deinem Beispiel zu bleiben würde die XML folgendermaßen aussehen:

Code: Alles auswählen

<Root>
<Child>
</Root>
Wie kommt man aber zu sowas?: (Quasi Child von Child)

Code: Alles auswählen

<Root>
<Child>
<Child2>
</Child>
</Root>
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QDOM- XML Datei erstellen - Zeilen einrücken

Beitrag von Christian81 »

Einfach ein weiteres appendChild() auf das child ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Stacked
Beiträge: 5
Registriert: 18. Juli 2011 08:26

Re: QDOM- XML Datei erstellen - Zeilen einrücken

Beitrag von Stacked »

Wenn ich das so mache:

Code: Alles auswählen

	QDomDocument doc( "Mydoc" );

	QDomElement root = doc.createElement("Root");				
	doc.appendChild( root );

	QDomElement child = doc.createElement( "Child" );
	root.appendChild(child);

	QDomElement child2 = doc.createElement( "Child2" );
	child.appendChild(child2);
Bekomme ich eine solche XML:

Code: Alles auswählen

<Child>
</Child>
<Child2>
</Child2>
<Root>
</Root>
Die Childs werden nicht zu childs von root gemacht bzw. child2 nicht zum Child von child.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QDOM- XML Datei erstellen - Zeilen einrücken

Beitrag von franzf »

Dann stimmt aber dein Code nicht mit dem überein, den du hier gepostet hast.

Code: Alles auswählen

#include <QtCore>
#include <QtXml>
#include <QDebug>

int main() {
    QDomDocument doc( "Mydoc" );

   QDomElement root = doc.createElement("Root");            
   doc.appendChild( root );

   QDomElement child = doc.createElement( "Child" );
   root.appendChild(child);

   QDomElement child2 = doc.createElement( "Child2" );
   child.appendChild(child2);
   
   qDebug() << doc.toString();
}
ergibt

Code: Alles auswählen

"<!DOCTYPE Mydoc>
<Root>
 <Child>
  <Child2/>
 </Child>
</Root>
" 
Genau das, was du doch willst, oder?
Stacked
Beiträge: 5
Registriert: 18. Juli 2011 08:26

Re: QDOM- XML Datei erstellen - Zeilen einrücken

Beitrag von Stacked »

franzf hat geschrieben:Genau das, was du doch willst, oder?
Ja, funktioniert. Danke an alle Helfer.
Antworten