getChildNodes() sollte mehr sein.

Status
Nicht offen für weitere Antworten.

Zed

Bekanntes Mitglied
Hallo,

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

Ich verwende JAXP + DOM.

Meine XML Datei.

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

Code:
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
Code:
Lenght: 1
[root: null]

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

THX 4 Help
 

AlArenal

Top Contributor
Der Fehler liegt in deinem Kopf.

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

Zed

Bekanntes Mitglied
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?

Code:
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.
 

Marco13

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

Code:
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

Bekanntes Mitglied
Jup rekursiv war das Stichwort.

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

Code:
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());
		}
	}
}
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben