[Java] sax.XMLReader Fehler ignorieren

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von unix, 19. Januar 2011 .

  1. 19. Januar 2011
    sax.XMLReader Fehler ignorieren

    Hey, ich hab diesmal folgendes Problem:

    Ich stelle einen Server dar, dem Clients XML Daten schicken.

    Diese Daten werden verarbeitet und in ner Datenbank gespeichert.
    Es funzt alles soweit (Software ist bereits in Betrieb) nur gibt es noch einen Bug.

    Der Bug tritt zwar nicht besonders häufig auf, muss aber verbessert werden.

    Die Daten werden verschachtelt in einer map geschickt und sobald ein kleiner Konventierungsfehler in den XML Daten zu finden ist, werden diese komplett verworfen mit ner Exception.

    Hier mal ein Beispiel, haben extra nen fehlerhaften Versionsstring eingebaut um den Fehler reproduzieren zu können:

    Code:
     protected XmlRpcRequest getRequest(final XmlRpcStreamRequestConfig pConfig,
     InputStream pStream) throws XmlRpcException {
     final XmlRpcRequestParser parser = new XmlRpcRequestParser(pConfig, getTypeFactory());
     final XMLReader xr = SAXParsers.newXMLReader();
     xr.setContentHandler(parser);
     try {
     xr.parse(new InputSource(pStream));//Hier wird die Exception geworfen
     } catch (SAXException e) {
     Exception ex = e.getException();
     if (ex != null && ex instanceof XmlRpcException) {
     throw (XmlRpcException) ex;
     }
     throw new XmlRpcException("Failed to parse XML-RPC request: " + e.getMessage(), e);
     } catch (IOException e) {
     throw new XmlRpcException("Failed to read XML-RPC request: " + e.getMessage(), e);
     }
     final List params = parser.getParams();
     return new XmlRpcRequest(){
     public XmlRpcRequestConfig getConfig() { return pConfig; }
     public String getMethodName() { return parser.getMethodName(); }
     public int getParameterCount() { return params == null ? 0 : params.size(); }
     public Object getParameter(int pIndex) { return params.get(pIndex); }
     };
     }
    Code:
    org.apache.xmlrpc.XmlRpcException: Failed to read XML-RPC request: Invalid byte 2 of 4-byte UTF-8 sequence.
     at org.apache.xmlrpc.server.XmlRpcStreamServer.getRequest(XmlRpcStreamServer.java:93)
     at org.apache.xmlrpc.server.XmlRpcStreamServer.execute(XmlRpcStreamServer.java:219)
     at org.apache.xmlrpc.webserver.Connection.run(Connection.java:208)
     at org.apache.xmlrpc.util.ThreadPool$Poolable$1.run(ThreadPool.java:68)
    Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 4-byte UTF-8 sequence.
     at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source)
     at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)
     at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)
     at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipChar(Unknown Source)
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
     at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(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 com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
     at org.apache.xmlrpc.server.XmlRpcStreamServer.getRequest(XmlRpcStreamServer.java:85)
     ... 3 more
    Gibt es eventuell eine Möglichkeit diesen Fehler zu ignorieren?
    Es wäre egal ob so ein kleiner Konventierungsfehler oder sonst was in die Datenbank kommt, Hauptsache die restlichen Daten werden nicht verworfen!

    Kennt da vllt. einer nen Weg ohne direkt in der API was zu ändern?
    Weil ich sitz jetzt schon dran mir den source von SAX zu Recht zu biegen..

    EDIT// merks grad, die Methoden von SAX sind nativ... xD
     
  2. 19. Januar 2011
    AW: sax.XMLReader Fehler ignorieren

    Du kannst zB mit JTidy fehlerhafte XML Dateien korrigieren und sie danach durch den SAX-Parser jagen, oder den mitgelieferten DOM-Parser von JTidy benutzen, falls dsa für dich in Frage kommt.

    Gruß,
    Figger

    //Doku gibts hier
     
  3. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.