4 Stimmen

Validierung des XML-Dokuments im Java-Quellcode von Oracle

Versuch, das Thema durchzuführen.

Ich versuche, xsd aus der Datei (schemasource = 1) und aus clob (schemasource = 0) zu verwenden. Ich habe zwei xsd-Schemas common_types.xsd und migom.xsd. Das zweite enthält das erste. Das Problem ist, dass ich beim Verwenden des common_types-Schemas aus der Datei einen Fehler erhalte.

ORA-29532: Java-Aufruf durch unbehandelte Java-Ausnahme beendet: oracle.xml.parser.v2.XMLParseException: Ein interner Fehler ist aufgetreten.

Und wenn ich das XML nur gegen das erste Schema überprüfe, das aus dem clob gelesen wurde, erhalte ich Erfolg, aber wenn ich das zweite xsd hinzufüge, erhalte ich denselben Fehler, der überhaupt nichts aussagt.

create or replace and compile java source named XmlTools AS
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.XMLReader;

import org.xml.sax.InputSource;
import oracle.sql.CLOB;
import java.io.IOException;
import org.xml.sax.SAXException;
import java.sql.SQLException;
import java.lang.IllegalArgumentException;
import oracle.xml.parser.v2.XMLParseException;
import javax.xml.parsers.ParserConfigurationException;

import java.io.*;

public class XmlValidator
{

  static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
  static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; 
  static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";

  public static void ValidateDocument(int schemasource, oracle.sql.CLOB schemadoc, oracle.sql.CLOB schemadoc1, oracle.sql.CLOB xmldoc) throws SAXException, IOException, SQLException, ParserConfigurationException, XMLParseException, IllegalArgumentException {

    try
          {              

            File myfile = new File(".//XML//common_types.xsd");
            if (myfile.exists())
            {
                Serv.log("ValidateDocument", "file size" + Long.toString(myfile.length()));
            }
            /*else
            {
                Serv.log("ValidateDocument", "file doesn't exists" );
            }*/

            Serv.log("ValidateDocument", "1" );
            SAXParserFactory factory = SAXParserFactory.newInstance();
            factory.setValidating(true);
            factory.setNamespaceAware(true);

            Serv.log("ValidateDocument", "2" );        
            SAXParser saxParser = factory.newSAXParser();
            saxParser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);

            if (schemasource == 0)
            {
                InputSource schemaIs = new InputSource(schemadoc.getCharacterStream());        
                InputSource schemaIs1 = new InputSource(schemadoc1.getCharacterStream());  

                InputSource[] schemas = {schemaIs, schemaIs1};

                //saxParser.setProperty(JAXP_SCHEMA_SOURCE,   schemaIs); 
                saxParser.setProperty(JAXP_SCHEMA_SOURCE,   schemas); 
            }
            else
            {            
                saxParser.setProperty(JAXP_SCHEMA_SOURCE,   ".//XML//common_types.xsd"); 
            }
            XMLReader reader = saxParser.getXMLReader();

            //  XML 
            InputSource documentIs = new InputSource(xmldoc.getCharacterStream());
            Serv.log("ValidateDocument", "3" );          
            // 
            reader.parse(documentIs);
            Serv.log("ValidateDocument", "4" );          
            documentIs = null;     

           }
    /*catch (SAXException e) 
    {
        Serv.log("ValidateDocument", "SAXException" );
        Serv.log("ValidateDocument", "document is not valid because ");
        Serv.log("ValidateDocument", e.getMessage());
        throw(e);
    }*/          
    catch (ParserConfigurationException e) 
    {
        Serv.log("ValidateDocument", "ParserConfigurationException" );
        throw(e);
    }
    catch (IOException e) 
    {
        Serv.log("ValidateDocument", "IOException" );        
        throw(e);
    }

    catch (XMLParseException e)
    {
        Serv.log("ValidateDocument", "XMLParseException" );        
        Serv.log("ValidateDocument", e.getMessage());
        StackTraceElement[] stack = e.getStackTrace();        
        for (int i = 0; i < stack.length; i++)
        {
         Serv.log("stacktrace element no " + Integer.toString(i), "toString: " + stack[i].toString());
         Serv.log("stacktrace element no " + Integer.toString(i), "file name: " + stack[i].getFileName() + ", class name: " + stack[i].getClassName() + ", method name: " + stack[i].getMethodName() + ", line : " + stack[i].getLineNumber());
        }

        throw(e);
    }
    catch (IllegalArgumentException e)
    {
        Serv.log("ValidateDocument", "IllegalArgumentException" );        
        Serv.log("ValidateDocument", e.getMessage());
        throw(e);    
    }           

    }

}

Zusätzliche Informationen aus dem Java-Stacktrace:

Dateiname: XMLError.java, Klassenname: oracle.xml.parser.v2.XMLError, Methodenname: flushErrors1, Zeile: 320 Dateiname: NonValidatingParser.java, Klassenname: oracle.xml.parser.v2.NonValidatingParser, Methodenname: parseDocument, Zeile: 300 Dateiname: XMLParser.java, Klassenname: oracle.xml.parser.v2.XMLParser, Methodenname: parse, Zeile: 200 Dateiname: XMLTOOLS, Klassenname: XmlValidator, Methodenname: ValidateDocument, Zeile: 86

Meine Oracle-Version ist Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod Aber mein Ziel ist es, es auf allen Versionen ab 9 zum Laufen zu bringen.

0voto

jtahlborn Punkte 51903

AKTUALISIEREN:

Also, haben Sie diese Dateien als CLOBs in die Datenbank geladen. Haben Sie ihr XML-Encoding beachtet, als Sie sie in die Datenbank eingefügt haben?

0voto

akhilss Punkte 136

Gemäß Ihrem Stacktrace sah ich, dass der NonValidatingParser verwendet wurde. Obwohl Sie das nicht als Problem genannt hatten, war es unerwartet. Ich weiß, dass xmlparserv2 einen Validating-Parser hat, also habe ich den dekompilierten XMLParser in der xmlparserv2.jar (ich habe sie bei mir, da ich mit OC4J arbeite) überprüft.

Der dekompilierte Quellcode ist unten aufgeführt. Wie Sie sehen können, geht der Konstruktor standardmäßig von einem Nicht-Validierungs-Parser aus. Die Verwendung von setProperty sollte es auf einen ValidatingParser umschalten, aber das geschieht nicht.

XMLParser()
{
    parser = new NonValidatingParser();
}

Ich konnte keine setProperty-Methode im dekompilierten Code finden. Das ist ungewöhnlich, aber ich habe das noch nicht weiter untersucht. Um die XML-Validierung zu aktivieren, denke ich, dass Sie eine andere API-Methode verwenden müssen. Ich glaube, die setAttribute-Methode wird das tun, was Sie wollen.

public void setAttribute(String s, Object obj) throws IllegalArgumentException {

    ............
    if(s == "http://java.sun.com/xml/jaxp/properties/schemaSource")
        schemaSource = obj;
    else
    if(s == "http://java.sun.com/xml/jaxp/properties/schemaLanguage")
    {
        if(((String)obj).equals("http://www.w3.org/2001/XMLSchema"))
            setValidationMode(3);
        getSchemaValidator().setJAXP(true);
    }
    .......................
    attributes.put(s, obj);
}

I habe es in einer Anwendung verwendet, die auf OC4J bereitgestellt wurde, von der ich weiß, dass sie denselben Parser verwendet. Das Codebeispiel wird unten gezeigt

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

factory.setNamespaceAware(true);

factory.setValidating(true);

factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");

factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", ClassUtil.getResourceAsStream(schemaSourceLocation));

Hoffentlich hilft das.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X