Processing Instruction überspringen

Status
Nicht offen für weitere Antworten.

Kiamur

Aktives Mitglied
Hallo!

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?

Gruß
Maik
 
R

Roar

Gast
hast du vielleicht noch eine externe DTD eingebunden? sicher dass es nicht vielleicht an der DTD liegt? probier einfach mal das:

Code:
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
 

Kiamur

Aktives Mitglied
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)
 

Kiamur

Aktives Mitglied
@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 ?!?
 
R

Roar

Gast
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...

"Eine DTD habe ich definitiv nicht." *öhöm* ;)
 

Bleiglanz

Gesperrter Benutzer
sind in dem xml dokument

zufälltig entites der form &irgendwas; enthalten?

und ein namespace vorhanden?
 
G

Guest

Gast
@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.

2.
"Eine DTD habe ich definitiv nicht." *öhöm*
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:

Gruß
Maik
 

Kiamur

Aktives Mitglied
OK, ich habe mal alles "verschlüsselt", was Infos enthalten könnte, da ich sonst in Teufels Küche kommen kann . . .

Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="http://xxxxxxxxx.xxx.xx.xx:999/abc/def/aaabbbccc/yyyy.xsl" type="text/xsl"?>
<!DOCTYPE SW-CNT PUBLIC "yyyyyyy.dtd" "http://XXXXXXXXXX.abc.de.fgh:999/abc/def/aaabbbccc/yyyy.dtd">

<SW-www>
	<IDENT>
		<www-DATEI>test.xml</www-DATEI>
		<www-VERSION-TYP>xxx</www-VERSION-TYP>
		<www-VERSION-INHALT>xxx</www-VERSION-INHALT>
		<www-VERSION-DATUM>2005-04-19</www-VERSION-DATUM>
		<www-IDENT-TEXT>xxxxxxxxxxxx;xxx%xxx%</www-IDENT-TEXT>
		<SW-VERSION-KURZ/>
		<SW-VERSION-LANG/>
		<www-CHECKSUMME>D9999A0EEAF9999A5EF9999990C19999992142D2</www-CHECKSUMME></IDENT>


Wie ich jetzt natürlich auch festgestellt habe, ist dort auch ein Pfad zu einer dtd Datei. :oops:


Was hast du denn noch für Infos für mich ? Ich bin ja sehr wissbegierig was xml betrifft, da ich mich damit in nächter Zeit intensiver befassen muss.
 
R

Roar

Gast
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
 

Kiamur

Aktives Mitglied
Hallo Roar!

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.

Danke noch mal!
Maik
 

Bleiglanz

Gesperrter Benutzer
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)
 

Kiamur

Aktives Mitglied
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.

MfG
Maik
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben