# im DOM anzahl der Knoten in tiefe 3 zählen



## BlubBlub (6. Sep 2009)

hi ich bereite mich gerade auf eine klausur vor und da war eine aufgabe die hieß:

a) schreiben sie ein programm das zählt wieviele knoten auf baumtiefe 3 liegen.
die dokumentwurzel zählt als baumtiefe 0, das erste element liegt bereits auf baumtiefe 1.

b) erweitern sie das programm, so dass das programm für alle knoten auf baumtiefe 3 ausgibt, wieviele startElement-Events zwischen dem startElement-Event und dem endElement-Event des Knotens auftreten. Bei einem Element in Tiefe 3 ohne Kind-Element ist die auszugebende Anzahl also 0.

hier hat man mit SAX gearbeitet, ich hab diese aufgabe auch gelöst und sie funktioniert.

nun wollte ich zur übung selbige aufgabenstellung mit DOM lösen. bei b würd ich dann zählen wieviele starttags  im xml dokument sind welches durch das DOM dargestellt wird,  anstelle der auftretenden startElement-Events. Läuft ja dann ungefähr auf dieselbe aufgabestellung hinaus.

ich hab dann erstmal folgendes probiert:


```
class Main
{

	public static void main(String[] args) 
	{
		String filename = "uni.xml";
		ToDo toDo = new ToDO();
		toDo.perform(filename);
	}
}

class ToDO
{
	public void perfom(String uri)
	{
		DOMParser parser = new DOMParser();
		
		try
		{
			parser.parse(uri);
			Document doc = parser.getDocument();
			rootElement = doc.getDocumentElement();
			
			count(rootElement);
		}
		catch(Exception e){}
	}
	
	public void count (Node currentNode)
	{
		Node thirdLevelNode = currentNode().getFirstChild().getFirstChild().getFirstChild();
		int counter = 0;
		
		while(thirdLevelNode != null)
		{
			counter++;
			thirdLevelNode = thirdLevelNode.getNextSibling();
		}
		System.out.println("Anzahl der Knoten auf Ebene 3 ist: " + counter);
	}
}
```

doch dann hab ich ein wenig überlegt und festgestellt, dass mein programm so nicht richtig funktionieren wird, weil  in tiefe 3 ja nich alle knoten geschwisterknoten sein müssen und mit getNextSibling() krieg ich nur jeweils den geschwisterknoten des akutellen knotens. und wenn ich mich nicht täusche ist es so, dass wenn knotenA zu ParentA gehört und knotenB zu ParentB, und ParentA und ParentB nur jeweils ein kind haben und knotenA und knotenB auf tiefe 3 sind dann bekomm ich mit knotenA.getNextSibling() nicht knotbenB, sondern null (korrigiert mich bitte wenn ich mich hier täusche). und deshalb ist mein programm so nicht richtig. 
als nächstes hab ich mir überlegt den baum rekursiv durchzugehen wie man es machen würde wenn man ein BinTree hätte


```
class BinTree
{
    Node left;
    int value;
    Node right;
```


aber dann ist mir eingefallen, dass ich ja eigentlich kein BinTree hab da der DOM mittels  der Datenstruktur Node realisiert wird und somit kann ich ihn nicht so rekursiv durchlaufen wie ichs bei einem BinTree könnte. 

nunja nun fällt mir nichts ein wie ich die aufgabe lösen könnte wenn ich sie anstelle mit SAX mit DOM lösen will. ich hoffe ihr könnt mir da weiterhelfen oder ein paar tipps geben.


----------



## BlubBlub (6. Sep 2009)

ich glaub ich hab jetzt doch ne lösung, die funktionieren könnte:



```
class Main
{

	public static void main(String[] args) 
	{
		String filename = "uni.xml";
		ToDo toDo = new ToDO();
		toDo.perform(filename);
	}
}

class ToDO
{
	int counter = 0;
	
	public void perfom(String uri)
	{
		DOMParser parser = new DOMParser();
		
		try
		{
			parser.parse(uri);
			Document doc = parser.getDocument();
			rootElement = doc.getDocumentElement();
			
			recurseNode(rootElement, 0);
		}
		catch(Exception e){}
	}
	
	public void recurseNode (Node node, int deep)
	{
		if(node.getNodeType() == Node.ELEMENT_NODE)
		{
			if(deep == 3)
				counter++;
			
			NodeList children = node.getChildNodes();
			
			if(children != null)
			{
				for(int i = 0; i < children.getLenth(); i++)
					recurseNode(children.item(i), deep+1);
			}
		}
		
	}
}
```

leider kann ich meine lösung nicht ausprobieren, weil ich die parser nicht importieren kann.
was würdet ihr sagen funktioniert das so?


----------



## BlubBlub (6. Sep 2009)

so nun hab ich a) und b) mit verwendung von DOM gelöst.
ist das so richtig? 


```
class Main
{
 
    public static void main(String[] args) 
    {
        String filename = "uni.xml";
        ToDo toDo = new ToDO();
        toDo.perform(filename);
    }
}
 
class ToDO
{
    int counter = 0;
    int startTags = 0;
    
    public void perfom(String uri)
    {
        DOMParser parser = new DOMParser();
        
        try
        {
            parser.parse(uri);
            Document doc = parser.getDocument();
            rootElement = doc.getDocumentElement();
            
            recurseNode(rootElement, 0);
        }
        catch(Exception e){}
    }
    
    public void recurseNode (Node node, int deep)
    {
        if(node.getNodeType() == Node.ELEMENT_NODE)
        {
            if(deep == 3)
                counter++;
            
            if(deep > 3)
            	startTags++;
            
            NodeList children = node.getChildNodes();
            
            if(children != null)
            {
                for(int i = 0; i < children.getLength(); i++)
                    recurseNode(children.item(i), deep+1);
            }
            
            if(deep == 3)
            {
            	System.out.println(startTags);
            	startTags = 0;
            }
        }
        
    }
}
```


----------

