XML einzelne elemente abzählen



  • hallo erst mal
    ich hab folgendes xml-file:

    ...
        <e05 intkennung="9"> 
          <sensoren>
             <e_0205_sv>
    	    <Pos>800</Pos>
    	    <Streuung>1</Streuung>
    	  </e_0205_sv>
    	  <e_0205_sr>
    	    <Pos>1110</Pos>
    	    <Streuung>20</Streuung>
    	  </e_0205_sr>
          </sensoren>
    ...
    

    anhand des arrtibuts "intkennung" wähl ich aus welches elment
    und jetzt würd ich ncoh gern abzählen wieviel sensoren ich in diesem element hab.

    hab mir mal folgenden code zusammengereimt:
    nodevalue = intkennung!!
    nrElem = das elment aus dem ich die sensoren zählen will.
    nodechar0 und nodechar1 damit ich nur die sensoren zähle.

    ...
    if(nodevalue.equals(nrElem))
    		{
    			if(nodechar0 == 'e' && nodechar1 == '_')
    			{
    				sens++;
    			}
    			else
    			{
    				NodeList children = node.getChildNodes();
    				if (children != null)   
    				{
    					int len = children.getLength();
    					for (int i = 0; i < len; i++) 	
    					{
    						System.out.println(node.getNodeName());
    						ANZ_SENS(children.item(i),nrElem);
    					}
    				}
    			}
    
    		}
    ...
    

    danke schon mal im voraus
    hoff ihr könnt mir helfen

    mfg peace



  • Wenn sich keine anderen Knoten in <sensoren> befinden außer den tatsächlichen Sensoren, sollte doch getChildNodes().getLength() genügen. Oder sehe ich das falsch?



  • hab jetzt so probiert
    aber ich bekomm unlogischweise für die variable sens den wert 9
    und noch unlogischwer für mich ist das die funktion öfters aufgerufen wird und sich der unlogische wert von 9 auf einen noch unlogischere 0 ändert

    sorry ist sicher der volle nebwie fehler den ich mach aber ich blicks einfach nicht

    😕 😕 😕

    NamedNodeMap attrs = node.getAttributes();
    		if(attrs != null)
    		{
    			if(attrs.getLength() != 0)
    			{
    
    				Node attr = attrs.item(0); 
    				nodevalue = attr.getNodeValue();
    				System.out.println(attr.getNodeValue()); 
    			}
    		}
    
    		if(nodevalue.equals(nrElem))
    		{
    				NodeList children = node.getChildNodes();
    				sens = children.getLength();
    				System.out.println(sens);
    
    		}
    		else
    		{		
    			NodeList children = node.getChildNodes();
    			if (children != null)   
    			{
    			int len = children.getLength();
    			for (int i = 0; i < len; i++) 						
    				ANZ_SENS(children.item(i),nrElem);
    			}
    		}
    


  • Ich gebe zu, dass meine Antwort wohl nicht zufriedendstellend war, denn so kann man die gewünschte Anzahl nicht immer genau ermitteln.

    Dieser "unlogische" Wert ergibt aus der Tatsache, dass Textknoten mitgezählt werden (z. B. Zeilenumbrüche). Schriebe man die Tags hintereinander weg, so könnte man die Anzahl korrekt ermitteln. Allerdings wäre es besser, die Textknoten bei einer Iteration zu ignorieren und nur die gewünschten Knoten zu zählen:

    if (intkennung.equals(nrElem))
            {
                for (int l = 0; l < e05.getChildNodes().getLength(); l++)
                {
                  Node sensoren = e05.getChildNodes().item(l);
    
                  if (sensoren.getNodeType() == Node.TEXT_NODE)
                   continue;
                  else
                   System.out.println("Anzahl Einträge: " + sensorenZaehlen(sensoren));
                }
            }
    
    public int sensorenZaehlen(Node sensoren)
       {
         int zaehler = 0;
    
         for (int k = 0; k < sensoren.getChildNodes().getLength(); k++)
         {
            if (sensoren.getChildNodes().item(k).getNodeType() != Node.TEXT_NODE)
             zaehler++;
         }
    
         return zaehler;
       }
    


  • erstmal entschuldige bitte das ich erst jetzt antworte aber ich war seit dienstag in prag und bin erst heute zurückgekommen

    hab deinen vorschlag gleich mal ausprobiert und etwas auf meine variablenamen und methoden angepasst

    was mich aber doch sehr stark irritiert an der ganzen geschichte is wenn ich den inhalt des elements e05 lösche er 0 ausgibt
    aber wenn jedoch das elment e05 zb. 2 sensoren enthält noch immer 0 ausgibt

    hab mich etwas mit dem debugger gespielt und hab erkannt das er gar nie soweit kommt das er den wert hochzählen könnte.
    aber warum das würd bedeuten das jeder nodetype der erreicht wird nur text wäre, ergibt das sinn??

    NamedNodeMap attrs = node.getAttributes(); 
            if(attrs != null)
            {
                if(attrs.getLength() != 0)
                {
    
                    Node attr = attrs.item(0);
                    nodevalue = attr.getNodeValue();
                    //zum testen gedacht: System.out.println(attr.getNodeValue());
                }
            } 
            if (nodevalue.equals(nrElem))
            {
                for (int l = 0; l < node.getChildNodes().getLength(); l++)
                {
                  node = node.getChildNodes().item(l);
    
                  if (node.getNodeType() == Node.TEXT_NODE)
                   continue;
                  else 
                  {
                	  for (int k = 0; k < node.getChildNodes().getLength(); k++)
                	  {
                	    if (node.getChildNodes().item(k).getNodeType() != Node.TEXT_NODE)
                	        sens++;
                	  }
                   }
                 }
            } 
            else
            {
            	NodeList child = node.getChildNodes();
            	for(int i=0;i<child.getLength();i++)
            		ANZ_SENS(child.item(i),nrElem);
            }
    


  • Schaue dir den Code noch mal genau an und überlege, welchen Namen du den Objekten gibst. So wie ich das sehe, steht das Objekt node für e05. Genau dieses belegst du aber in der ersten Zeile der for-Schleife mit einem seiner Kindknoten. Wenn dieser ein Textknoten ist, hat er natürlich keine weiteren Unterelemente.
    Probier’s mit

    Node kindKnoten = node.getChildNodes().item(l);
    

    und arbeite mit diesem weiter.



  • so ich bedanke mich rechtherzlich für eure hilfe

    es funktioniert *gg*

    ich post ncohmal den gesamten code damit ihr wisst was ich genau gemacht hab
    aja falls ein kommentar falsch ist würd mich freuen wenn ihr das postets. Dann weiss ich das ich da was nicht richtig verstanden hab.
    Auf jedenfall schau ich mir nochmal genau die funktionsweise des DOM an, ich glaub da liegt mein hauptproblem.

    folgende methode wird im main aufgerufen:

    public int getSensAnz(int nrElem)
    	{
    		/*Parst das Document (ganzes XML-File) in Element (zb. gesAnlage)*/
    		Node node = ((Document)document).getDocumentElement();
    		String ElementenNummer = String.valueOf(nrElem);
    
    		scanDOMTree.ANZ_SENS(node,ElementenNummer);
    		return (scanDOMTree.sens);
    	}
    

    folgendes ist ne methodeaus einer zwischenklasse da ich mir nicht anders zu helfen wusste:

    static public void ANZ_SENS (Node node,String nrElem)
    	{
    		/*Attribute durchsuchen um gewünschtes Element zu finden!*/
            NamedNodeMap attrs = node.getAttributes(); 
            if(attrs != null)
            {
                if(attrs.getLength() != 0)
                {
    
                    Node attr = attrs.item(0);
                    nodevalue = attr.getNodeValue();
                }
            } 
            /*Wenn Attribut mit gewünschten Element übereinstimmt mach folgendens:*/
            if (nodevalue.equals(nrElem))
            {
            	/*Druchsuche das kompletet Element (zb.; exx*/
                for (int l = 0; l < node.getChildNodes().getLength(); l++)
                {
                  /*Elemente(sensoren,motor) des Elements (exx) durchsuchen!*/
                	Node childnode = node.getChildNodes().item(l);
                  /*Textknoten auslassen, da sie sonst mitgezählt werden (^= zählfehler)*/
                  if (childnode.getNodeType() == Node.TEXT_NODE)
                   continue;
                  else 
                  {
                	  for (int k = 0; k < childnode.getChildNodes().getLength(); k++)
                	  {
                	    if (childnode.getChildNodes().item(k).getNodeType() != Node.TEXT_NODE)
                	    {
                	    	/*Nur die Sensoren abzählen, ansonsten würde motor auch mitgezählt werden!*/
                	    	if(childnode.getNodeName() == "sensoren")
                	    	{
                	    		sens++;
                	    	}
                	    }
                	   }
                	 }
                  }
               }
    			else
    	        {
    	        	NodeList child = node.getChildNodes();
    	        	for(int i=0;i<child.getLength();i++)
    	        		ANZ_SENS(child.item(i),nrElem);
    	        }
    	}
    

    also nochmals vielen vielen dank für eure hilfe!! 😃


Anmelden zum Antworten