Knoten mit bestimmtem Attributwert zurückgeben



  • Hallo zusammen,

    ich versuche gerade in diesem urdf-mäßigen QDomDocument

    <robot name="KUKA KR300">
    
    	<link name="link0">
    		<visual>
    			<geometry>
    	                          <part file="link0.stl"/>
    			</geometry>
    		</visual>
    	</link>
    
    	<link name="link1">
    		<visual>
    			<geometry>
    		                  <part file="link1.stl"/>
    			</geometry>
    		</visual>
    	</link>
    	<link name="link2">
    		<visual>
    			<geometry>
    				<part file="link2.stl"/>
    			</geometry>
    		</visual>
    	</link>
            <joint name="joint1" type="continuous">
                    <parent link="link0"/>
                    <child link="link1"/>
            </joint>
            <joint name="joint2" type="fixed">
                    <parent link="link1"/>
                    <child link="link2"/>
            </joint>
    

    alle joint-Knoten herauszufiltern, deren unterknoten einen bestimmten Attributinhalt haben und eine Referenz auf den joint-knoten zurückzugeben. Also beispielsweise finde den joint, dessen child "parent" das Attribut "link" mit dem Wert "link0" hat.

    Bisher habe ich im Netz einen Ansatz gefunden, bei dem zumindest nach einem bestimmten Attribut gefiltert wird.

    void findNodesWithAttributeName(const QDomNode& node, const QString& attr, QList<QDomNode>& foundNodes)
    {
      if( node.attributes().contains(attr) )
        foundNodes.append(node);
    
      QDomElement child = node.firstChildElement();
      while( !child.isNull() ) {
        findNodesWithAttributeContent(child, attr, foundNodes);
        child = child.nextSiblingElement();
      }
    }
    

    Quelle: http://stackoverflow.com/questions/17836558/can-i-find-all-xml-nodes-with-a-given-attribute-in-a-qdomdocument

    1. Problem: diese Funktion gibt leider keine referenzierbaren Knoten aus (könnten auch Elemente sein, diese lassen sich ja auch auslesen mit...

    beispielknoten.firstChildElement("parent").attribute("link");
    

    2. Problem: Wie kann die Funktion umgebaut werden, dass diese nicht nach dem Namen eines Attributes sondern nach dem Inhalt sucht?

    Vielen Dank für eure Hilfe



  • Das Problem ist jetzt gelöst (geht doch ziemlich einfach 😃 ). Es geht mit einer simplen Schleife, die Lösung ist vllt nicht so elegant wie eine rekursive Funktion, ermöglicht aber das navigieren durch die Knoten eines XML-Dokumentes. Hier wird nach einem link mit dem Namen linkName gesucht. linkElement und die XmlStructure können global in einer Klasse erzeugt und nach der Suchfunktion dann aufgerufen werden.

    QDomDocument XmlStructure;
    QDomElement linkElement;
    
    bool searchForLinkElement(const QString& linkName)
    {
    	linkElement = XmlStructure.documentElement().firstChildElement("link");
    	int numberOfLinkElements = XmlStructure.elementsByTagName("link").length();
    
    	for(int i = 0; i < numberOfLinkElements; i++)
    	{
    		if(linkElement.attribute("name") == linkName)
    		{
    			return true;
    		}
    		linkElement = linkElement.nextSiblingElement();
    	}
    	linkElement.clear();
    	qDebug() << "searching for link element named " << linkName << " failed";
    	return false;
    }
    

Log in to reply