Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich bin recht unerfahren in Xml, und habe deshalb folgende Frage:
Ich habe ein Xml-Dokument, das im Prolog eine "Processing instruction" der Form "<?xml-stylesheet href="http://.../.../test.xsl" type="text/xsl"?>" hat.
Wenn ich da jetzt den SAX Parser drauf loslasse, dann bekomme ich lauter Fehlermeldungen, die etwas mit Sockets, NetworkClient, HTTPClient, usw. zu tun haben. Lösche ich die Zeile aus dem Xml-Dokument heraus, dann läuft alles tadellos.
Ich brauche das xsl-Dokument nicht, und möchte deswegen diese Zeile überspringen, ohne dass die Processing instruction beim Parsen bearbeitet wird. Gibt es da eine Möglichkeit?
Also, ich kann euch ja mal meinen Quellcode mitschicken. Eine DTD habe ich definitiv nicht. Der Quellcode ist größtenteils aus einem Beispiel von SUN, glaube ich. Ist nur zum Testen für mich, funktioniert aber schon genau so, wie ich es möchte, wenn die besagte Zeile gelöscht ist. Die Xml-Datei darf ich leider nicht vorführen (Betriebsgeheimnis . . .).
Code:
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import javax.swing.JFrame;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class Echo01 extends DefaultHandler
{
public static void main(String argv[])
{
if (argv.length != 1)
{
System.err.println("Usage: cmd filename");
System.exit(1);
}
// Use an instance of ourselves as the SAX event handler
DefaultHandler handler = new Echo01();
// Use the default (non-validating) parser
SAXParserFactory factory = SAXParserFactory.newInstance();
try
{
// Set up output stream
out = new OutputStreamWriter(System.out, "UTF8");
// Parse the input
SAXParser saxParser = factory.newSAXParser();
saxParser.parse( new File(argv[0]), handler);
}
catch (Throwable t)
{
t.printStackTrace();
}
//System.exit(0);
JFrame frame = new XMLFrame();
frame.setVisible(true);
}
static private Writer out;
private boolean prfam = false;
private boolean prnum = false;
//===========================================================
// SAX DocumentHandler methods
//===========================================================
public void startDocument()
throws SAXException
{
emit("<?xml version='1.0' encoding='UTF-8'?>");
nl();
}
public void endDocument()
throws SAXException
{
try
{
nl();
out.flush();
}
catch (IOException e)
{
throw new SAXException("I/O error", e);
}
}
public void startElement(String namespaceURI,
String lName, // local name
String qName, // qualified name
Attributes attrs)
throws SAXException
{
if(qName == "PRNFAMILIENUMMER")
prfam = true;
if(qName == "PRNNUMMER")
prnum = true;
}
public void endElement(String namespaceURI,
String sName, // simple name
String qName // qualified name
)
throws SAXException
{
if(qName == "PRNFAMILIENUMMER")
prfam = false;
if(qName == "PRNNUMMER")
prnum = false;
}
public void characters(char buf[], int offset, int len)
throws SAXException
{
if (prfam)
{
String s = new String(buf, offset, len);
emit(s);
nl();
}
if (prnum)
{
String s = new String(buf, offset, len);
emit(" " + s);
nl();
}
}
//===========================================================
// Utility Methods ...
//===========================================================
// Wrap I/O exceptions in SAX exceptions, to
// suit handler signature requirements
private void emit(String s)
throws SAXException
{
try
{
out.write(s);
out.flush();
}
catch (IOException e)
{
throw new SAXException("I/O error", e);
}
}
// Start a new line
private void nl()
throws SAXException
{
String lineEnd = System.getProperty("line.separator");
try
{
out.write(lineEnd);
}
catch (IOException e)
{
throw new SAXException("I/O error", e);
}
}
}
Hier dann noch mal die Fehlermeldungen:
<?xml version='1.0' encoding='UTF-8'?>java.net.UnknownHostException: processweb.wob.vw.vwg
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.<init>(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at Echo01.main(Echo01.java:66)
@roar: Hat zwar etwas gedauert, bis ich deine Antwort gerafft habe, aber jetzt klappt es wenn ich deine Codezeile einbaue. Was ist denn das, was ich damit gemacht habe ?!?
du hast eine zeile <!DOCTYPE blup ... "http://...">
der parser will die dtd datei laden und schmiert ab, mit der zeile sagst du nur, dass er die nicht laden soll...
@roar: also funktionieren tut das ganze ja jetzt. Trotzdem noch 3 Fragen:
1. Warum muss ich denn so einen String mit einer url angeben, wenn ich nur sagen will, dass ich keine dtd benutzen möchte.
Das verstehe ich auch nicht. Was meinst du damit ?!?
3. Warum muss ich überhaupt etwas mit einer dtd angeben? Die Zeile, wegen der das Ganze ja erst nicht funktioniert hat zeigt doch auf eine xsl-Datei. In meiner begrenzten xml-Welt sind dtd und xsl zwei unterschiedliche Dinge.
@bleiglanz: Deine Fragen überfordern mich leider etwas. Wie gesagt, ich bin ziehmlich neu in der Materie. Ixh habe zwar schon was über Entites und Namespaces in xml-Dateien gelesen, kann das aber noch nicht richtig zuordnen.
Auf alle Fälle vielen Dank an euch beide, denn schließlich funktioniert es ja jetzt. :toll:
1. das ist keine URL, nur ein String, der ausschaut wie eine URL
2. du hast gesagt du hättest keine DTD (zitat). du benutzt aber eine
<!DOCTYPE SW-CNT PUBLIC "yyyyyyy.dtd" "http://XXXXXXXXXX.abc.de.fgh:999/abc/def/aaabbbccc/yyyy.dtd">
warum sagst du was falsches? :?
3. nein, es funktinoiert nicht, weil er die DTD nicht laden kann
Also was falsches habe ich nur gesagt, weil ich es nicht besser gewusst habe, sorry. Ich selber habe aber die dtd Datei wirklich nicht. Das war wahrscheinlich das Problem.
wenn du tatsächlich gegen die DTD validieren willst, sollte es reichen, die Datei
"yyyyyyy.dtd"
zu besorgen und ins gleiche Verzeichnis wie das xml-Dokument zu legen.
Nur zur Info: dein Problem war einfach, dass die meisten Parser bei Vorhandensein einer DTD irgendwie versuchen diese zu besorgen (deshalb auch der Zugriff aufs Netzwerk)
Danke noch mal für diesen Hinweis, aber so, wie es jetzt ist soll es sein. Die dtd wird nicht benötigt, und soll auch nicht über das Netz besorgt werden.