unbekannte XML Datei parsen und ausgeben

Status
Nicht offen für weitere Antworten.

Saxony

Top Contributor
Hiho,

ich möchte gerne mit dem DOM Parser eine beliebige XMLDatei parsen und diese dann als JTree anzeigen.

Code:
import org.w3c.dom.Document;
[...]
File xmlFile = null;
xmlFile = new File("data/MyXML.xml");

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

Document doc = builder.parse(xmlFile);

Das einlesen klappt ja soweit.
Nun die Frage wie iteriere ich nun über alle Knoten und Blätter des DOM Baumes ohne das ich irgendwelche TagNamen usw. weiß ?

Vielen Dank
bye Saxony
 

stevieboy

Aktives Mitglied
Ich würde schätzen, dass es eine Methode gibt, die eine Liste aller Kind-Knoten eines Knotens rausgibt.

Diese Methode müsste dann rekursiv aufgerufen werden mit ROOT als Startwert.
<PSEUDOCODE>
Code:
private void printAllNodes(Node startNode){

List nodeList = startNode.getAllChilds();

for (Node node : nodeList){
      //JTREE-Knoten hier einfügen
      // ...jtree-code...

   if( node.hasChilds() ){
      //methode aufrufen um alle Kindknoten des Knotens   anzuzeigen 
      printAllNodes(node);
   }
}
</PSEUDOCODE>

So ungefähr könnte das gehen. Oder?
 

Murray

Top Contributor
Mit dem W3C-DOM sähe das dann wohl etwa so aus:
Code:
	private void printAllElements( Element startElem){

		NodeList nl = startElem.getChildNodes();

		int len = nl.getLength();
		for ( int i=0; i<len; i++) {
			Node ni = nl.item( i);
			if ( ni instanceof Element) {
				Element el = (Element)ni;
				//JTREE-Knoten hier einfügen
				// ...jtree-code...

				//methode aufrufen um alle Kindknoten des Knotens   anzuzeigen
				printAllElements( el);
		   }
		}
	}
 

FenchelT

Bekanntes Mitglied
Saxony hat gesagt.:
Hiho,

ich möchte gerne mit dem DOM Parser eine beliebige XMLDatei parsen und diese dann als JTree anzeigen.

Code:
import org.w3c.dom.Document;
[...]
File xmlFile = null;
xmlFile = new File("data/MyXML.xml");

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

Document doc = builder.parse(xmlFile);

Das einlesen klappt ja soweit.
Nun die Frage wie iteriere ich nun über alle Knoten und Blätter des DOM Baumes ohne das ich irgendwelche TagNamen usw. weiß ?

Vielen Dank
bye Saxony


Hallo Saxony,

habe das vor ein paar Tagen selbst benoetigt und bin fast fertig.
Das einzige was noch anzupassen ist, ich gebe im Moment ein zweiDim Array zurueck, werde das noch in ArrayList oder etwas anderes aendern.

Ansonsten funktioniert das schon ganz gut
Du benoetigst die jdom.jar und kannst dann diesen COde nutzen:


Code:
package trial.XML;

import java.util.*;
import java.io.*;
import org.jdom.*;
import org.jdom.input.*;

/**
 * 
 * @author  FenchelT
 * @version 1.0
 * @since   25-10-2007
 * 
 */
public class ReadXMLStructures 
{
	private String strFilename;
	private String[][] strTableDefDouble;
	private int dimOne = 0;
	private int dimTwo = 0;
	
	

/**
 * 
 * @param filename		= Name und Pfad der XML-Datei
 * 
 */	
	public ReadXMLStructures(String filename)
	{
		this.strFilename = filename;
		this.strTableDefDouble = new String[200][2];
	}

/**
 * 
 * @return Ein zweiDim Array mit den Daten zur Tabellenstruktur
 * Im FehlerFall enthaelt das Array an Pos[0][0] den Wert "Fehler"
 */
	
	

	public String[][] getDataFromXML()
	{
		try
		{
			/**
			 * Read XML File
			 */ 
			SAXBuilder builder = new SAXBuilder();
			Document doc = builder.build(new File (this.strFilename));
			
			
			/**
			 * Lese das WurzelVerzeichnis
			 * Root Element = Clearing
			 */
			Element root = doc.getRootElement();
			
			strTableDefDouble[dimOne][dimTwo] = root.getName();
			dimOne++;
			
			
			/**
			 * Lese Root Attribute
			 */
			getAttributes(root);
			

			/**
			 * Lese Elemente
			 */
			getElements(root, 0);
			
		}
		catch (Exception ex)
		{
			this.strTableDefDouble[0][0] = "Fehler";
			ex.printStackTrace();			
		}
			
			
		return this.strTableDefDouble;
	}
	
	
	
	private void getElements(Element elem, int zaehler)
	{
		
		List listElements = elem.getChildren();
		
		for (int i=0; i <= listElements.size() -1; i++)
		{
			Element el = (Element) (listElements.get(i));
			
			if(el.getChildren().size()== 0)
			{
				strTableDefDouble[dimOne][dimTwo] = el.getName();
				strTableDefDouble[dimOne][dimTwo+1] = el.getValue();
				dimOne++;
			}
			else
			{
				strTableDefDouble[dimOne][dimTwo] = el.getName();
				dimOne++;
			}
			
			getAttributes(el);
			
			
			if (zaehler < listElements.size())
			{
				
				getElements(el, zaehler);
				
			}
		
			
			zaehler++;
		}
	}
	
	
	private void getAttributes(Element elem)
	{
		List listAttributes = elem.getAttributes();
		
		for (int p = 0; p <= listAttributes.size()-1; p++)
		{
			
			Attribute attr = (Attribute) (listAttributes.get(p));
			
			strTableDefDouble[dimOne][dimTwo] = attr.getName();
			strTableDefDouble[dimOne][dimTwo+1] = attr.getValue();
			dimOne++;
		}
	}
}


Viel Spass
 

Saxony

Top Contributor
Hiho,

also ich habe nun folgendes probiert:

Code:
private void printAllNodes(Node aStartNode, DefaultMutableTreeNode aParent) {

    NodeList nodeList = aStartNode.getChildNodes();

    for (int i = 0; i < nodeList.getLength(); i++) {

        Node node = nodeList.item(i);

        if (!node.getNodeName().equals("#text")) {

            String name = node.getNodeName();
            String text = node.getTextContent();
				
            DefaultMutableTreeNode child = new DefaultMutableTreeNode(name + " | " + text);
				
            aParent.add(child);
				
            if (node.hasAttributes()) {

                NamedNodeMap attributes = node.getAttributes();

                for (int j = 0; j < attributes.getLength(); j++) {

                    Node attr = (Node) attributes.item(j);

                    String attrName = attr.getNodeName();
                    String attrValue = attr.getNodeValue();
						
                    DefaultMutableTreeNode attrChild 
                    = new DefaultMutableTreeNode(attrName + " | " + attrValue);
						
                    child.add(attrChild);
                }
            }

            if (node.hasChildNodes()) {

                printAllNodes(node, child);
            }
        }
    }
}

Soweit so gut.

Meine XMLDatei sieht so aus:

Code:
<?xml version="1.0" encoding="iso-8859-1"?>
<application>
	<frame layout="null">
		<item type="button">
			<bounds>
				<startx>10</startx>
				<starty>10</starty>
				<width>50</width>
				<height>10</height>
			</bounds>
		</item>
	</frame>
</application>

Hier kann man sehen was dann als JTree rauskommt.

So nun folgendes:

Als erstes muss ich immer solche komischen #text elemente rausfiltern - was ist das und was bedeuten die?
Weiterhin zeigt mir node.getTextContent() leider auch den Text der Kinder XML-Tags mit an. Ich möchte aber nur den TextContent des aktuellen Elementes haben.
Also bei frame, item und bounds brauche ich zum beispiel nicht den Text der erst zu startx,starty usw. gehört.

nunja
bye Saxony
 

Murray

Top Contributor
Die NodeList enthält eben alle Nodes, nicht nur die Knoten. Um alles andere auszufiltern (eben z.B. diese Text-Nodes, die für irgendwelche Whitespace-Sequenzen in der Quelldate stehen), hatte ich in meinen Beispiel geprüft, ob die Nodes "instanceof Element" sind. Wenn du das machst, kannst du dir das Filern über den Namen sparen.
 

Saxony

Top Contributor
Murray hat gesagt.:
Die NodeList enthält eben alle Nodes, nicht nur die Knoten. Um alles andere auszufiltern (eben z.B. diese Text-Nodes, die für irgendwelche Whitespace-Sequenzen in der Quelldate stehen), hatte ich in meinen Beispiel geprüft, ob die Nodes "instanceof Element" sind. Wenn du das machst, kannst du dir das Filern über den Namen sparen.

Fabulös, das funktioniert.

Nun brauch ich nur noch den TextContent des aktuellen Node und nicht gleich komplett den seiner ganzen Kinder.

Hat da einer ne Idee?

bye Saxony
 

Murray

Top Contributor
Brauchst du das in deinem Fall denn wirklich? Das ist doch eigentlich nur dann ein Problem, wenn man "mixed content" hat, also Elemente, die sowohl Text- als auch strukturierten Content haben, also so etwas:
Code:
<a>
  etwas text
  [b]auch text[/b]
  <c/>
</a>

Bei dir haben die Elemente doch entweder Text-Content oder eben weitere Kind-Elemente; insofern könnte man sich den Text-Content ja nur dann holen, wenn keine inneren Elemente vorhanden sind.
 

Saxony

Top Contributor
Hiho,

naja wie gesagt es handelt sich um eine unbekannte XML-Datei also könnte es auch sein, dass auch schon ein Parent TextContent enthält und nicht erst die Blätter der Hierarchie.

bye Saxony
 

Saxony

Top Contributor
Hiho,

ich nochmal. Hat nicht vielleicht doch jemand ne Idee mit dem TextContent ohne Child TextContent ?

So naja hat sich soweit erstma geklärt, nehme jetzt JDOM zum Auslesen. :)

bye Saxony
 

Saxony

Top Contributor
Hiho,

ich nochmal.

Falls jemand noch die Lösung zur Generierung eines TreeNode-Baumes aus einer beliebigen XMLDatei im JDOM Stil braucht:

Code:
private void printAllNodes(Element aStartNode,
			DefaultMutableTreeNode aParent) {

		List nodeList = aStartNode.getChildren();

		for (int i = 0; i < nodeList.size(); i++) {

			Object obj = nodeList.get(i);

			if (obj instanceof Element) {

				Element node = (Element) obj;

				String name = node.getName();
				String text = node.getText();

				DefaultMutableTreeNode child = new DefaultMutableTreeNode(name
						+ " | " + text);

				aParent.add(child);

				List attributes = node.getAttributes();

				for (int j = 0; j < attributes.size(); j++) {

					Object obj2 = attributes.get(j);

					if (obj2 instanceof Attribute) {

						Attribute attr = (Attribute) obj2;

						String attrName = attr.getName();
						String attrValue = attr.getValue();

						DefaultMutableTreeNode attrChild = new DefaultMutableTreeNode(
								attrName + " | " + attrValue);

						child.add(attrChild);
					}
				}

				printAllNodes(node, child);
			}
		}
	}

bye Saxony
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Tags in XML Datei mit Java erstellen XML & JSON 3
S XML Datei speichern nicht möglich XML & JSON 13
M Objekt zu jsonArray in .json datei hinzufügen ? XML & JSON 3
J Object in JSON Datei einlesen und als neues Object erzeugen (in ein Object Array) XML & JSON 29
I Mit Hibernate eine XML-Datei in eine Tabellenspalte einlesen. XML & JSON 1
MiMa Buch Metadaten aus XML Datei parsen XML & JSON 48
J Auslesen der Länge einer XML-Datei in Android Studio XML & JSON 8
R xlsx-Datei mit Apache POI einlesen XML & JSON 18
S Validierung einer XML-Datei - Führende Leerzeichen und Tabs XML & JSON 10
S CSV Datei einlesen und XML Ausgeben XML & JSON 2
U jar Datei mit ant erstellen XML & JSON 1
P wie kriege ich eine *.dtd Datei mit in die ausführbare *.jar? XML & JSON 2
K XML Datei erstellen und Daten daraus in Java auslesen XML & JSON 6
D XML-Datei per Button erstellen XML & JSON 3
K JAR-File mit XML-Datei XML & JSON 1
M Text eines Elements in XML Datei mit JAVA bearbeiten und kompletten Element-Zweig hinzufügen XML & JSON 16
I Liste in YAML Datei speichern und wieder auslesen XML & JSON 1
A Leeres Array beim Auslesen von XML-Datei XML & JSON 4
E JTreedaten in eine XML Datei speichern XML & JSON 3
D Int-Werte in XML-Datei schreiben (DOM) XML & JSON 2
B xsd-Datei ins jar file XML & JSON 5
T Formulardaten in XML Datei speichern XML & JSON 5
H Wsdl datei XML & JSON 2
D Große XML-Datei in einzel Dateien splitten XML & JSON 3
S Neue Inhalte in XML-Datei einfügen XML & JSON 0
S JDOM XML Datei darstellen Fehler! XML & JSON 2
S Xml File für den Aufbau einer anderen Xml Datei XML & JSON 6
M XML-Datei mit JAXB und 2 Namespaces XML & JSON 0
J XML - Datei wird nicht ganz angezeigt XML & JSON 2
P (Eclipse)Ant Script, .jar Datei erstellen mit MANIFEST.MF XML & JSON 12
Z XML Datei mit JDOM einlesen und verarbeiten XML & JSON 6
K Beim Parsen einer XML-Datei Connection timed out XML & JSON 4
E ResultSet als XML Datei speichern XML & JSON 7
M XStream, CSV Datei XML & JSON 9
A Frage zu bestehender XML Datei XML & JSON 6
A Simple Constructor Injection Datei-Pfad XML & JSON 6
K Einlesen eines Parameters aus HTML-Datei XML & JSON 4
Maxim6394 Lesen/Schreiben von XML Datei XML & JSON 9
A XML datei lesbar speichern (eingerückt) XML & JSON 7
M XML Datei Parsen XML & JSON 4
Airwolf89 HTML Datei mit SAXBuilder laden hängt sich auf XML & JSON 4
N Java Code aus XML Datei generieren XML & JSON 8
D Aus lesen einer XML-Datei ( 1 root, 3 childs) XML & JSON 7
D Wie XML Datei einlesen und HTML entities übernehmen? XML & JSON 3
R XLM Datei lesen Ändern (kompliziertes Search and Replace) und Speichern XML & JSON 12
K Kurze XML Datei Parsen XML & JSON 5
S XSD-Datei zulässige Werte auslesen XML & JSON 3
M XML Datei heapspace erreicht XML & JSON 3
M Große Datei auslesen/in dieser suchen XML & JSON 2
S Konforme XML Datei über XSD erstellen XML & JSON 2
M RSS-Datei auslesen von Yahoo Webservice XML & JSON 4
T Inhalt einer .xml Datei auf Javaoberfläche wiedergeben XML & JSON 4
M XML Datei drucken XML & JSON 8
T Daten aus Programm in XML Datei speichern XML & JSON 2
D XSD Datei erstellen XML & JSON 4
L [SAX] Geschachtelte XML Datei parsen XML & JSON 3
E XML Datei mit DOM auslesen (Text mit Attributen) XML & JSON 2
G txt. Datei in xml datei konvertieren XML & JSON 21
K XML Datei in ein Java package „einbinden" XML & JSON 3
L Reihenfolge beim xml Datei parsen einhalten? XML & JSON 8
L xml Datei parsen ohne End-Tag XML & JSON 6
C if-Abfrage mit Datei Variable aus XML-Datei XML & JSON 2
sylo Beim Erzeugen einer XML Datei auch die XML Struktur erzeugen? XML & JSON 11
sylo DOM Document in XML Datei schreiben XML & JSON 5
F XML Datei in Java einlesen XML & JSON 4
J Objektstruktur aus XML-Datei erzeugen XML & JSON 21
D ID's aus XML Datei rauslesen und in Java ausgeben XML & JSON 7
E XML Datei einlesen und Elemente in der Console ausgeben XML & JSON 6
N value Wert einer XML Datei mit JAVA bearbeiten XML & JSON 21
ARadauer Aus XML Datei Objekte erstellen... XML & JSON 3
N MalformedByteSequenceException bei Lesen aus XML Datei XML & JSON 2
H xml-Datei mit Attributen einlesen XML & JSON 3
A XML-Datei: Ab wann kritische Größe erreicht? XML & JSON 4
multiholle XML Datei elegant verarbeiten XML & JSON 14
M XMI-Datei auslesen XML & JSON 4
T Ließt keine XML Datei XML & JSON 2
R JAXB: Aus einem Vector oder List XML Datei erstellen XML & JSON 1
J XML-Datei ein Array einlesen XML & JSON 10
M xml - datei erstellen XML & JSON 2
T Wie einen String(XML Inhalt) in eine XML Datei speichern? XML & JSON 8
P Große XML Datei mittels JDOM bearbeiten / einlesen XML & JSON 6
H XML-Datei in einzelne XML-Dateien zerlegen XML & JSON 2
G Tags oder Zeilen der Not-Validen XML-Datei XML & JSON 7
C Suche in XML-Datei XML & JSON 6
D Zeilennummer in der XML - Datei XML & JSON 5
S Einlesen einer xml Datei XML & JSON 4
M Datei parsen XML & JSON 5
S PDF Erzeugung - Probleme mit der XML Datei bei Schema-Infos XML & JSON 2
S XML Datei einlesen, aber root überspringen XML & JSON 2
T Werte in XML Datei an entsprechender Stelle einfügen XML & JSON 3
L XML Datei in Java angeben Pfad? XML & JSON 3
A Mehrere Anwender sollen auf eine XML-Datei zugreifen XML & JSON 4
A SVG Datei auslesen und Batik XML & JSON 1
N neue XML-Datei erstellen mit vorhandener Struktur XML & JSON 18
D XML Datei innerhalb einer JAR Datei parsen XML & JSON 2
M brauche große XML-Datei für XPath-Tests XML & JSON 4
L mit Java eine HTML-Datei erstellen XML & JSON 3
L bz2-Datei parsen XML & JSON 9
A xml-schema aus wsdl auslagern in eine eigene xsd-Datei XML & JSON 3
S objekte in xml datei packen (JAXB) XML & JSON 5

Ähnliche Java Themen

Neue Themen


Oben