Antwort
 
Themen-Optionen Thema durchsuchen
Alt 16.11.2005, 09:09 Nach oben    #1
wersi77
Gast
 
Beiträge: n/a
Standard Teilbaum ziehen

Hallo,

wie extrahiere ich einen Teilbaum aus einem DOM-Document und Parse diesen als String?

<root>
<erster>
<...> </...>
</erster>

<zweiter>
<...> </...>
</zweiter>
</root>

Ich hätte nun gerne den Teilbaum "zweiter".
Und hätte es so gemacht:
NodeTree nTree = doc.getElementbyTagName("zweiter");
String meinBaum = nTree.toString();

Aber irgendwie klappt das nicht...
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2005, 09:43 Nach oben    #2
Benutzer
 
Registriert seit: 15.11.2005
Beiträge: 75
Standard

Zitat:
Zitat von wersi77
NodeTree nTree = doc.getElementbyTagName("zweiter");
Meinst Du org.wc3.dom.NodeList statt NodeTree? Wenn nicht: welche XML/DOM-Bibliothek willst Du verwenden?

Zitat:
Zitat von wersi77
String meinBaum = nTree.toString();
Das ist nicht so einfach.


Lösen könnte man das so:

Code:
try {
	
		//--- Datei parsen
		javax.xml.parsers.DocumentBuilder db = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
		org.w3c.dom.Document doc = db.parse( new java.io.FileInputStream( "myfile.xml"));
		
		//--- das erste Element mit dem Tag "<zweiter>" holen
		org.w3c.dom.NodeList nl = doc.getElementsByTagName( "zweiter");
		org.w3c.dom.Node n = nl.item( 0);
	
		//--- OutputStream fuer die Serialisierung vorbereiten
		java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
		
		//--- Teilbaum serialisieren
		javax.xml.transform.Transformer trans = javax.xml.transform.TransformerFactory.newInstance().newTransformer();
		trans.transform( new javax.xml.transform.dom.DOMSource( n), new javax.xml.transform.stream.StreamResult( baos));
		
		//--- Ergebnis in String überführen und ausgeben
		String str = baos.toString();
		System.out.println( str);
		
	} catch ( Exception e) {
		e.printStackTrace();
	}
Murray ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2005, 09:46 Nach oben    #3
wersi77
Gast
 
Beiträge: n/a
Standard

Besten Dank...
Ist aber komplizierter als ich dachte...
Gibts da nichts einfacheres, zumal solche Methoden doch auf der Hand liegen...
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2005, 10:09 Nach oben    #4
Benutzer
 
Registriert seit: 15.11.2005
Beiträge: 75
Standard

Die APIs sind eigentlich wesentlich mächtiger; so kann man am Transformer noch diverse Einbstellungen vornehmen (Endocing, Formatierung, ...). Außerdem will man meistens eben nicht einfach nur einen String erzeugen, sondern braucht auch die Möglichkeit, z.B. in andere Streams schreiben zu lassen. Daher sind die javax.xml.* und org.w3c.dom.* APIs auf den ersten Blick sehr kompliziert. Es bietet sich meistens an, für die eigenen "Standardaufgaben" einen kleine Hilfsklasse zu schreiben, die das intern kapselt.

Bei mir sieht das so aus:

Code:
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

public class DOMHelper {

	private static DocumentBuilder DocBldr;
	private static Transformer Trans;
  
	  
	static {
		try {
		    DocBldr = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		   
			Trans = TransformerFactory.newInstance().newTransformer();
		    Trans.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "no");
			Trans.setOutputProperty( OutputKeys.INDENT, "yes");
			Trans.setOutputProperty( OutputKeys.STANDALONE, "yes");
			Trans.setOutputProperty( OutputKeys.ENCODING, "ISO-8859-1");
		   
  

		} catch ( Exception e) {
			e.printStackTrace();
		}
	}
   

	public static Element getChild( Node nd, String name)  {
	   
		NodeList nl = nd.getChildNodes();
		if ( nl == null) return null;
		int len = nl.getLength();
		if ( len == 0) return null;
		ArrayList<Element> eLst = new ArrayList<Element>();
		for ( int i=0; i<len; i++) {
			Node ni = nl.item( i);
			if ( ni instanceof Element) {
				Element ei = (Element)ni;
				if ( name.equals( ei.getTagName())) {
				    eLst.add( ei);
				}
			}		
		}
		len = eLst.size();
		if ( len == 0) return null;
		if ( len == 1) return eLst.get( 0);
		throw new IllegalArgumentException( "Tag-name " + name + " not unique in node " + nd);
	}
   
	public static String getChildAsText( Node nd, String name){
		Element e = getChild( nd, name);
		return (e == null) ? null : e.getTextContent();
	}

	public static List<Element> getChildren( Node nd) {
	   
		List<Element> lst = new ArrayList<Element>();
		NodeList nl = nd.getChildNodes();
		if ( nl != null) {
				int len = nl.getLength();
				for ( int i=0; i<len; i++) {
				    Node ni = nl.item( i);
				 if ( ni instanceof Element) {
					 lst.add( (Element)ni);
					}
				}
			}
	   
		return lst;	   
	}

	public static void output( Node nd, OutputStream out) throws TransformerException {

		synchronized ( Trans) {
			
			DOMSource src = new DOMSource( nd);
			Trans.transform( src, new StreamResult( out));
		}
	}

	public static synchronized Document parse( File f) throws IOException, SAXException {
	   
		return DocBldr.parse( new FileInputStream( f));
	}

	public static synchronized Document parse( InputStream in) throws IOException, SAXException {
	   
		return DocBldr.parse( in);
	}
   
	public static String serialize( Node nd) throws TransformerException {

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		output( nd, baos);
	   
		return baos.toString();
	}


}
Damit vereinfacht sich das Beispiel zu:
Code:
	try {
		org.w3c.dom.Document doc = DOMHelper.parse( new java.io.File( "myfile.xml"));
		org.w3c.dom.Node n = DOMHelper.getChild( doc.getDocumentElement(), "zweiter");
		String str = DOMHelper.serialize( n);
		System.out.println( str);
	} catch ( Exception e) {
		e.printStackTrace();
	}
Murray ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2005, 10:21 Nach oben    #5
wersi77
Gast
 
Beiträge: n/a
Standard

Nicht schlecht.
So ähnlich haben wir das bestimmt irgendwo auch...
Allerdings gehen einige Funktionen in dem Wust unseres Projektes bei ca. 400000 Zeilen Code ein wenig unter...
Mal sehen, ob ich Deine Funktionen verwenden kann...
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2005, 18:43 Nach oben    #6
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 582
Standard

JDom ist auch ein sehr guter XML-Parser, und meiner Meinung nach einfacher zu bedienen als die Standartimplementierung.

Die Lib gibts hier: http://www.jdom.org

Und ein gutes tut steht auf der Insel: http://www.galileocomputing.de/openb...00047C1F030100
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.11.2005, 20:18 Nach oben    #7
Benutzer
 
Registriert seit: 15.11.2005
Beiträge: 75
Standard

JDOM ist näher an den Java-APIs als das W3C-DOM (welches ja eher sprachunabhängig definiert ist und daher - s. NodeList - Strukturen mitbringt, die eher gewöhnungbedürftig sind). Allerdings kann man sich auch hier mit dem Helper-Ansatz (s.o.) behelfen und sich Utilities schreiben, die z.B. eine org.w3c.dom.NodeList in eine java.util.List<org.w3c.Node> wandeln.

BTW: ich habe früher auch lieber mit JDOM gearbeitet
Murray ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.11.2005, 16:30 Nach oben    #8
Clip
Gast
 
Beiträge: n/a
Standard

"//root/zweiter" :cool:
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.11.2005, 18:01 Nach oben    #9
Bleiglanz
Gast
 
Beiträge: n/a
Standard

myNode.cloneNode(true)
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Java EE 5 oder J2EE ohne Application Server ziehen la-finest Allgemeine Java-Programmierung 2 04.07.2007 23:30
elegant summe aus array-values ziehen? javaphob Allgemeine Java-Programmierung 1 22.03.2005 13:34
Fenster ziehen RooKee Desktop-Applikationen und Grafik 1 25.10.2004 15:06


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45