XML auslesen - tiefe&attribute

Alles rund um die Programmierung mit Qt
Antworten
musicplanet
Beiträge: 2
Registriert: 30. Januar 2007 15:18

XML auslesen - tiefe&attribute

Beitrag von musicplanet »

Hallo ich versuche ein XML-Doc einzulesen:

sample.xml:
__________________________

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<morphy>
<startLemma>
<form>test</form>
<lemma wkl="SUB" kas="NOM" num="SIN" en="MAS">Freitag</lemma>
<lemma wkl="SUB" kas="DAT" num="SIN" gen="MAS">Freitag</lemma>
<lemma wkl="SUB" kas="AKK" num="SIN" gen="MAS">Freitag</lemma>
</startLemma>
<startLemma>
<form>,</form>
<lemma wkl="SZK">,</lemma>
</startLemma>
</morphy>
__________________________
Mein Script dazu:

main.cpp:
__________________________

Code: Alles auswählen

QDomDocument doc;
	doc.setContent( &crnameFile );

	QDomNode node = doc.documentElement().firstChild();    

		while ( !node.isNull() ) {
			
			
			 if ( node.isElement() && node.nodeName() == "startLemma" ) {
			 	
                     	QString text = node.toElement().text();
                     	
                     	QString wkl = node.toElement().attribute( "wkl" );
						
						QString kas = node.toElement().attribute( "kas" );
						

					qDebug() << text << "\n";
					qDebug() << wkl << "\n";
					qDebug() << kas << "\n";
					
			 }
__________________________

Ich versuche jedes <form>-Tag zu bekommen und die dazugehörigen <lemma>-Tags mit den jeweiligen Attributen.

Derzeit bekomme ich leider nur folgende Ausgabe:
"testFreitagFreitagFreitag"
Sprich er gibt mir zwar alle text() aus, aber wie komme ich an das jeweilige <form>Tag und <lemma>-Tag mit den Attributen...

Hoffe ihr könnt mir helfen..
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Ich kann mir irgendwie nicht vorstellen, dass Du die Ausgabe bekommst, bei dem Code.

Wenn du ne while Schleife machst, solltest du node auch neu zuweisen oder?
Sonst müsste das ganze eigentlich in einer Endlosschleife enden.

Das nächste ist, dass Du den Inhalt eines Knotens soweit ich weiss auch mit nodeValue bekommst (ohne Konvertierung zu einem QDomElement).

Wenn du innerhalb der if Abfrage die als Bedingung ja hat, dass es sich bei "node" um den startLemma Knoten handeln muss, eine Abfrage des Attributs "wkl" hast, dann dürfte dabei eigentlich nichts sinnvolles rauskommen, da der startLemma Knoten kein solches Attribut hat...

also wie schon gesagt, irgendwie kann ich die angebliche Ausgabe nicht in Verbindung zu dem Code bringen.

Guck dir mal die Doku zu QDomNode bzw. QDomElement besser an und dort besonders die elementsByTagName Funktion, die firstChildElement und die nextSiblingElement Funktion
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
musicplanet
Beiträge: 2
Registriert: 30. Januar 2007 15:18

Beitrag von musicplanet »

Hallo Volker,
vielen Dank für deine Antwort - hab es jetzt anders gemacht:

XML:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<morphy>
<form>test</form>
<lemma wkl="SUB" kas="NOM" num="SIN" gen="MAS">Freitag</lemma>
<lemma wkl="SUB" kas="DAT" num="SIN" gen="MAS">Freitag</lemma>
<lemma wkl="SUB" kas="AKK" num="SIN" gen="MAS">Freitag</lemma>
<form>,</form>
<lemma wkl="SZK">,</lemma>
</morphy>

CPP:

Code: Alles auswählen

QDomElement root = doc.documentElement();
    if( root.tagName() != "morphy" ) // Root-Element
        return -3; 
    
	QDomNode node = root.firstChild();    

		while ( !node.isNull() ) {
			
			int myInsertID;
		
			QDomElement ent = node.toElement(); 
					
			
				if( !ent.isNull() )
        		{
        			if( ent.tagName() == "form" ) 
            		{
            			QString form = ent.toElement().text();
            			
						myInsertID = form_insert(form);
						
            			qDebug()  "Form:" << form << " ; "; 	
            			
            		}
        			
            		if( ent.tagName() == "lemma" ) 
            		{
            			QString text = ent.toElement().text();
            			QString wkl2 = ent.toElement().attribute( "wkl" );
            			QString kas2 = ent.toElement().attribute( "kas" );
            			QString num2 = ent.toElement().attribute( "num" );
            			QString gen2 = ent.toElement().attribute( "gen" );
            			
            			qDebug() << "Lemma:" << text << "At:"<< wkl2 << kas2 << num2 << gen2 << "; "; 
            		}
            			
        		}
   			
  			 node = node.nextSibling();
Das funktioniert, aber eigentlich sollte es ja anders sein.
Wie würdest du denn die cpp umschreiben, wenn das xml.doc so gebaut wäre?

Code: Alles auswählen

<morphy>
<startLemma>
<form>test</form>
<lemma wkl="SUB" kas="DAT">Freitag</lemma>
<lemma wkl="SUB" kas="AKK">Freitag</lemma>
</startLemma>
<startLemma>
<form>d</form>
<lemma wkl="SUB" kas="AKK">Freitag</lemma>
<lemma wkl="SUB" kas="AKK">Freitag</lemma>
</startLemma>
</morphy>
Sprich ich muss noch eine Ebene tiefer in den Knoten (mit 2 while-Schleifen - 1 <lemmaForm> die andere auf <lemma>).
Vielen Dank
abenstex
Beiträge: 30
Registriert: 12. September 2006 16:33

Beitrag von abenstex »

Also ich persönlich benutze bei sowas immer QDomDocument::elementsByTagName( const QString & tagname ) und lese dann die QDomNode Elemente der resultierenden QDomNodeList entsprechend aus.
Antworten