# getChildNodes() sollte mehr sein.



## Zed (11. Apr 2007)

Hallo,

mein Problem ist das ich versuche an den Inhalt einer XML DAtei zu kommen. 

Ich verwende JAXP + DOM. 

Meine XML Datei. 


```
<?xml version="1.0" encoding="Cp1252"?>
<root>
	<element>
		<value verify="true">Wert</value>
		<value>Wert2</value>
	</element>
</root>
```


```
try {
      // ---- Parse XML file ----
      DocumentBuilderFactory factory  = DocumentBuilderFactory.newInstance();
      DocumentBuilder        builder  = factory.newDocumentBuilder();
      Document               document = builder.parse( new File( path ) );
      
     NodeList list= document.getChildNodes();
    System.out.println("Lenght: "+ list.getLength());
	   for (int i = 0; i < list.getLength(); i++) {
                   System.out.println(list.item(i));
              }
```

Ausgabe 

```
Lenght: 1
[root: null]
```

Die Ausgabe passt ja vorne und hinten nicht. Weiß jemand wo mein Fehler liegt?

THX 4 Help


----------



## AlArenal (11. Apr 2007)

Der Fehler liegt in deinem Kopf.

Die Datei hat richtigerweise ein Wurzelelement und genau das sagt dir auch dein Code.


----------



## Zed (11. Apr 2007)

Danke für die Antwort. 

Mein Problem ist ich möchte die Struktur einer XML File herrausfinden damit ich daraus dann eine Maske in JSF bauen kann um die Attribute zu verändern. 

Zur Zeit hab ich diese Lösung um an die Menge der Tags zu kommen. Was mich daran stört ist das ich die vorkommenden Tags erst definieren muss. Gibts da eine bessere Möglichkeit? 


```
public static final String tags[] = new String[]{"root","element","value"};
public final int tagsLenght = tags.length;

public int getElementsCount() throws Exception
{
	int elements = 0;
	try {
                  // ---- Parse XML file ----
	      DocumentBuilderFactory factory    = DocumentBuilderFactory.newInstance();
	      DocumentBuilder           builder     = factory.newDocumentBuilder();
	      Document                     document = builder.parse( new File( path ) );
		      		      
	      for(int i=0;i<tagsLenght;i++)
	      {
	         NodeList tagliste   = document.getElementsByTagName(tags[i]);
	         elements           += tagliste.getLength();
	      }
  
	  return elements;
		
}
```
Bin dankbar für Lösungsansätze.


----------



## AlArenal (11. Apr 2007)

Sorry, JSF ist nun überhaupt nicht meine Baustelle.


----------



## Marco13 (11. Apr 2007)

Das müßte doch rekursiv machbar sein? Ungefähr so ....


```
public int getElementsCount() throws Exception
{
   int elements = 0;

.... document aufmachen, parsen...

     elements = getElementsCount(document.getDocumentElement());
 
     return elements;
}

private int getElementsCount(Node node)
{
    int result = 1;
    for (int i=0; i<node.getChildNodes().getLength(); i++)
    {
        result += getElementsCount(node.getCildNodes().item(i));
    }
    return result;
}
```


----------



## Zed (12. Apr 2007)

Jup rekursiv war das Stichwort.

Mein Ergebnis dieses Schlüssel jede XML Datei auf. Bin von dom auf jdom umgestiegen. 


```
public class ReadElements {
//  Path to XML File
	public static final String path = "C:/Workspace/XMLEdit/data/test.xml";
		
	public ReadElements(){
		try {
			SAXBuilder builder = new SAXBuilder();
			Document document  = builder.build(path);
		
			listNodes(document,0);
					
	    } catch ( Exception e){
	    	e.printStackTrace();
	    }
	}
	private static void listNodes(Object o, int depth){
		if(o instanceof Element){
			Element element = (Element)o;
			System.out.println("Element: " + element.getName());
			List att = element.getAttributes();
			Iterator itAtt = att.iterator();
			while (itAtt.hasNext()){
				Attribute attribute = (Attribute)itAtt.next();
				System.out.println("Name: "+attribute.getName()+" Value: "+attribute.getValue());
			}
			List content = element.getContent();
			Iterator it = content.iterator();
			while (it.hasNext()){
				Object obj = it.next();
				listNodes(obj,depth+1);
			}
		}else if (o instanceof Document){
			Document document = (Document) o;
			System.out.println("Document");
			List content = document.getContent();
			Iterator it= content.iterator();
				while (it.hasNext()){
					Object obj =it.next();
					listNodes(obj, depth +1);
				}
	    }else if (o instanceof Comment){
			System.out.println("Comment");
		}else if (o instanceof Text){
			Text text = (Text)o;
			System.out.println("Text: "+text.getTextTrim() );
		}else if (o instanceof EntityRef){
			System.out.println("Entity reference");
		}else if (o instanceof ProcessingInstruction){
			System.out.println("Processing instruction");
		}else{
			System.out.println("Unexpectet type: " + o.getClass());
		}
	}
}
```


----------

