DOM document aus XMLString erzeugen

Bad_Law

Mitglied
Hallo zusammen,
ich hänge grade an dem Versuch aus einem XMLString ein DOM document zu erzeugen...

Java:
DocumentBuilderFactory factory;
DocumentBuilder builder;
Document doc;

factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder();
Reader reader = new StringReader(xmlString);
InputSource src = new InputSource(reader);
doc = builder.parse(src.getByteStream());

merkwürdigerweise wird beim Aufruf von builder.parse(src.getByteStream()) eine IllegalArgumentException geworfen weil der InputStream null ist...
Was mache ich falsch?
 
Ich kann's nicht erklären, aber das src.getByteStream() kommt mir in dem Zusammenhang merkwürdig vor. Geht das nicht, wenn du nur src benutzt? Also ohne das .getByteStream() ?
 
komischerweise nicht

Code:
java.lang.Error: Unresolved compilation problem: 
	The method parse(InputStream) in the type DocumentBuilder is not applicable for the arguments (InputSource)
...
 
Ok, ich bin aber trotzdem fast sicher, dass ich das irgendwann mal ohne geschafft hab :)

http://java.sun.com/javase/6/docs/api/org/xml/sax/InputSource.html hat gesagt.:
There are two places that the application can deliver an input source to the parser: as the argument to the Parser.parse method, or as the return value of the EntityResolver.resolveEntity method.

The SAX parser will use the InputSource object to determine how to read XML input. If there is a character stream available, the parser will read that stream directly, disregarding any text encoding declaration found in that stream. If there is no character stream, but there is a byte stream, the parser will use that byte stream, using the encoding specified in the InputSource or else (if no encoding is specified) autodetecting the character encoding using an algorithm such as the one in the XML specification. If neither a character stream nor a byte stream is available, the parser will attempt to open a URI connection to the resource identified by the system identifier.

Benutzt du da keinen SAXParser, sondern was anderes?
 
ich benutze einen SAX Parser.

In der API existiert auch eine Methode die eine InputSource entgegennimmt aber die ist abstrakt.

Gibt es eine Möglichkeit das ganze irgendwie in einen InputStream zu bekommen ohne InputSource zu benutzen?
 
Hallo,

schau mal hier

Java:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;


public class DomStringExample {

	public static void main(String[] args) {
		
		String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
				"<top>" +
				"<eins>" +
				"<zwei/>" +
				"</eins>" +
				"</top>";
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse(new InputSource(xml));
			
		} catch (Exception e) {
			e.printStackTrace();
		} 
		
	}
	
}

Du brauchst nicht unbedingt den StringReader.


MFG

zEriX
 
Zuletzt bearbeitet:
Wenn ich deine Klasse ausführe erhalte ich folgende Exception

Code:
java.io.FileNotFoundException: C:\Java\workspace\Test\<?xml version="1.0" encoding="UTF-8"?><top><eins><zwei\><\eins><\top> (Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(FileInputStream.java:106)
	at java.io.FileInputStream.<init>(FileInputStream.java:66)
	at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:70)
	at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:161)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:653)
	at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:186)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:225)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283)
	at DomStringExample.main(DomStringExample.java:34)
kein Konstruktor von InputSource nimmt das XML als String entgegen...
 
Zuletzt bearbeitet:
Ok, kleiner Fehler von mir. :-) Ich hätte mir vielleicht mal die Api anschauen sollen. ;-)

So funktioniert es aber.

Java:
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;


public class DomStringExample {

	public static void main(String[] args) {
		
		String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
				"<top>" +
				"<eins>" +
				"<zwei/>" +
				"</eins>" +
				"</top>";
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse(new InputSource(new StringReader(xml)));
			
			
		} catch (Exception e) {
			e.printStackTrace();
		} 
		
	}
	
}


MFG

zEriX
 
Ah, OK Danke.
Jetzt frage ich mich allerdings warum ich ohne weiteres die abstrakte Methode "DocumentBuilder.parse(InputSource)" benutzen kann.

---
edit:mir ist auch grade noch aufgefallen das mein oben erwähnter Fehler auf eine ungünstige import anweisung (InputSource aus einem anderen Paket) zurückzuführen war
 
Zuletzt bearbeitet:
Das liegt daran, dass Sun auch direkt eine implementierte Variante mit ausliefert. Du bekommst du von der Factory ein Object geliefert. Von abstracten Klassen kann man ja kein Object erstellen. Also erzeugt die Factory direkt ein Object von der ausprogrammierten Klasse. Deshalb funktioniert das.

Ich hoffe ich hab es halbwegs verständlich erklärt.

MFG

zEriX
 
Zurück