XML-Datei auslesen und die Attributwerte als Baum darstellen

blaiso

Grünschnabel
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
 
Hallo!

Schau mal hier:
Code:
 /**
  * 
  */
 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:
Code:
 <?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
 

Anhänge

  • xmlJtree.png
    xmlJtree.png
    9 KB · Aufrufe: 1.906
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...
 
Zurück