# XML-Datei auslesen und die Attributwerte als Baum darstellen



## blaiso (8. Juli 2005)

Guten Tag,

ich möchte gern aus meiner XML-Datei die Attributwerte auslesen und mit Hilfe von JTree diese als Baum darstellen:

- <XML>
- <Package packagename="Ptest1">
- <Class classname="Ctest1">
- <Methode methodename="Mmain1">
  <Variable>String[] "[Ljava.lang.String;@82ba41"</Variable> 
  </Methode>
  </Class>
  </Package>
+ <Package packagename="Ptest2">
- <Class classname="Ctest2">
- <Methode methodename="Mmethode2">
  <Variable>int "0"</Variable> 
  <Variable>String "In diesem Strin da steht ein Satz"</Variable> 
  </Methode>
  </Class>
  </Package>
- <Package packagename="Ptest3">
- <Class classname="Ctest3">
- <Methode methodename="Mmethode3">
  <Variable>int "1"</Variable> 
  <Variable>String "In diesem Strin da steht ein Satz"</Variable> 
  </Methode>
  </Class>
  </Package>
- <Package packagename="Ptest4">
- <Class classname="Ctest4">
- <Methode methodename="Mmethode4">
  <Variable>int "2"</Variable> 
  <Variable>String "In diesem Strin da steht ein Satz"</Variable> 
  </Methode>
  </Class>
  </Package>
  </XML>

Als Ausgabe möchte ich zum Beispiel:

   Ptest1
      Ctest1
      Mmain1
      String[] "[Ljava.lang.String;@82ba41
  Ptest2
      Ctest2
      Mmain2

Ich wollte folgendes machen:
Zuerst die XML-Datei lesen und als Baum in einem Dos-Fernster ausgeben.

private void dateiLesen(String pfad)
    {
File datei;
FileReader dateiL;
BuffredReader br;
      try
	  {
      	datei = new File(pfad);
      	dateiL = new FileReader(datei);
      	br = new BufferedReader(dateiL);

      	zeile = br.readLine().trim();
    	System.out.println("---------------------------");



      	while(zeile!="</XML")
      	{

      		if(zeile.charAt(1)=='P')
      		{	
      		   begin = zeile.indexOf("=")+3;
      		   ende = zeile.length()-3;
      		   sub = zeile.substring(begin,ende);
      		   System.out.println(sub);

      		}
      		if(zeile.charAt(1)=='C')
      		{
      		    begin = zeile.indexOf("=")+3;
       		    ende = zeile.length()-3;
       	             sub = zeile.substring(begin,ende);
       		    System.out.println("   "+sub);

                    while(zeile!="</Class>")
                      {
                           zeile = br.readLine().trim();
                            begin = zeile.indexOf("=")+3;
       		         ende = zeile.length()-3;
       	                  sub = zeile.substring(begin,ende);
       		         System.out.println("   "+sub);
                      }
      		}   

      		zeile = br.readLine().trim();

	  }
      	br.close();
	  }

      	 catch (FileNotFoundException fnfe)
		  {
	      	System.out.println("Datei nicht gefunden");
		  }
	      catch(IOException e)
	      {
	      		System.out.println("Fehler beim Lesen der Datei");
	  	  }
}


Gruß
Blaiso


----------



## Thomas Darimont (9. Juli 2005)

Hallo!

 Schau mal hier:

```
/**
  * 
  */
 package de.tutorials;
 
 import java.awt.Dimension;
 import java.io.File;
 
 import javax.swing.JFrame;
 import javax.swing.JScrollPane;
 import javax.swing.JTree;
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.xml.parsers.DocumentBuilderFactory;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
 /**
  * @author Tom
  * 
  */
 public class XMLJTreeExample extends JFrame {
 
 	public XMLJTreeExample() {
 		super("XMLJTreeExample");
 		setDefaultCloseOperation(EXIT_ON_CLOSE);
 		DefaultMutableTreeNode root = new DefaultMutableTreeNode();
 
 		synchronizeXmlWithModel(new File(
 		        "E:/jboss/4.0.2/jboss-4.0.2/docs/examples/jca/mysql-ds.xml"),
 				root);
 
 		JTree tree = new JTree(root);
 		JScrollPane scrollPane = new JScrollPane(tree);
 		scrollPane.setPreferredSize(new Dimension(180, 640));
 		add(scrollPane);
 
 		pack();
 		setVisible(true);
 	}
 
 	private void synchronizeXmlWithModel(File file, DefaultMutableTreeNode root) {
 		try {
 			Document doc = DocumentBuilderFactory.newInstance()
 		    		.newDocumentBuilder().parse(file);
 			root.setUserObject(file.getName());
 			buildTreeModelByTreeWalk(doc, root);
 
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
 	}
 
 	private void buildTreeModelByTreeWalk(Node node,
 			DefaultMutableTreeNode parentTreeNode) {
 		DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode();
 
 		switch (node.getNodeType()) {
 		case Node.COMMENT_NODE: {
 			treeNode.setUserObject(node.getTextContent());
 
 		}
 			break;
 		case Node.ELEMENT_NODE: {
 			treeNode.setUserObject(node.getNodeName());
 		}
 			break;
 		case Node.TEXT_NODE: {
 			String textContent = node.getTextContent().trim();
 			if (textContent.equals("")) {
 				return;
 			}
 			treeNode.setUserObject(textContent);
 		}
 			break;
 		}
 
 		parentTreeNode.add(treeNode);
 
 		if (node.hasChildNodes()) {
 			NodeList list = node.getChildNodes();
 			for (int i = 0, len = list.getLength(); i < len; i++) {
 				buildTreeModelByTreeWalk(list.item(i), treeNode);
 			}
 		}
 	}
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {
 		new XMLJTreeExample();
 	}
 }
```
 
 Das XML Dokument:

```
<?xml version="1.0" encoding="UTF-8"?>
 
 <!-- $Id: mysql-ds.xml,v 1.3.2.1 2004/12/01 11:46:00 schrouf Exp $ -->
 <!--  Datasource config for MySQL using 3.0.9 available from:
 http://www.mysql.com/downloads/api-jdbc-stable.html
 -->
 
 <datasources>
   <local-tx-datasource>
 	<jndi-name>MySqlDS</jndi-name>
 	<connection-url>jdbc:mysql://mysql-hostname:3306/jbossdb</connection-url>
 	<driver-class>com.mysql.jdbc.Driver</driver-class>
 	<user-name>x</user-name>
 	<password>y</password>
     <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
 	<!-- sql to call when connection is created
 	<new-connection-sql>some arbitrary sql</new-connection-sql>
 	  -->
 	<!-- sql to call on an existing pooled connection when it is obtained from pool 
 	<check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
 	  -->
 
 	<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
 	<metadata>
 	   <type-mapping>mySQL</type-mapping>
 	</metadata>
   </local-tx-datasource>
 </datasources>
```
 
 Gruß Tom


----------



## leder (30. April 2008)

Hi Tom,

habe Deinen XMLJTreeExample in ein eclipse Plugin eingebaut. Soweit sogut...
Aber um auf das Attribut eines Nodes zuzugreifen (attr_name) habe ich den Code folgendermassen erweitert:


-------------------Schnipp
case Node.ELEMENT_NODE: {
 			treeNode.setUserObject(node.getNodeName());
 			String nodeStr = node.getNodeName();
 			if ((nodeStr).equals("folder")) {//here Attribute auslesen TODO: create
 				NamedNodeMap attr = node.getAttributes();
 				String attr_name=attr.getNamedItem("name").toString();
// 				String attr_create=attr.getNamedItem("create").toString(); //HERE

// 				if (attr_create==null||attr_create.equals("")) {
 					treeNode.setUserObject(nodeStr+" "+attr_name);
// 				} else {
// 					treeNode.setUserObject(node.getNodeName().toString()+" "+attr_name+" "+attr_create);
// 				};
 			}
 				/*if (attr_create==null||attr_create.equals("")) {

 				} else {
 					JCheckBox checkbox = new JCheckBox ();
 					treeNode.setUserObject(checkbox);
 				}*/
 		}

--------------Schnipp

jetzt ist aber kein Zugriff auf weitere Attribute (attr_create, auskommentiert) mehr möglich!

Sobald ich den Kommentar "HERE" in den Code übernehme, geht das XML parsen schief!

Habe ich etwas übersehen?

Gruß

leder
P. S. entschuldigt die fehlende Formatierung, komme mit dem Editor hier nicht richtig zurecht...


----------

