2011-10-17 12 views
4

件名を入力しようとしています。oracleのJavaソースでXML文書を検証しています

私はファイル(schemasource = 1)とclob(schemasource = 0)からxsdを使用しようとしています。 common_types.xsdとmigom.xsdという2つのxsdスキーマがあります。秒は最初に含まれます。 問題は、私は、ファイルからcommon_typesスキーマを使用していたとき、私はエラー

ORA-29532を取得していることである:キャッチされないJava例外でJavaコールが終了:oracle.xml.parser.v2.XMLParseException:内部エラー状態が発生しました。

とxmlを検証するときに最初のスキーマだけがclobから読み込まれていますが、私は成功しますが、2番目のxsdを追加すると、何も言わない同じエラーが発生します。

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);  
    }   


    } 

} 

追加情報は、Javaスタックトレースから得た:

ファイル名:XMLError.java、クラス名:oracle.xml.parser.v2.XMLError、メソッド名:flushErrors1、行:320 ファイル名を:クラス名:oracle.xml.parser.v2.NonValidatingParser、メソッド名:parseDocument、行:300 ファイル名:XMLParser.java、クラス名:oracle.xml.parser.v2.XMLParser、メソッド名:parse 、行:200 ファイル名:XMLTOOLS、クラス名:XmlValidator、メソッド名:ValidateDocument、行:86

私のOracleバージョンは、Oracle Database 10g Enterprise Editionのリリース10.2.0.1.0である - のProd しかし、私の目的は、それが9

答えて

0

UPDATEから始まるすべてのバージョンで動作するようにすることです。そう

、あなたはにこれらのファイルをロードCLOBとしてのデータベースそれらをデータベースに挿入したときにXMLエンコーディングを尊重しましたか?

+0

は役に立ちませんでした。私は、これらの2つのスキーマを1つに統合して、それをclobとして置くと、同じエラーにつながると言うことができます。そのため、問題は二番目のxsdにあると思うが、私は正確に何かを見つけることができない!すべてのスキーマ - 2つのスタンドアロンとマージされたものが整形式で有効である(altova xmlspyでチェック) –

+0

はい、私はdothファイル<?xml version = "1.0" encoding = "windows-1251"でエンコードを指摘していますか?> –

+0

右、それらを文字列に変換してデータベースに格納するときに、そのエンコーディングを使用しましたか? – jtahlborn

0

StackTraceごとに、NonValidatingParserが使用されていることがわかりました。あなたはそれを問題として言及していませんでしたが、それは予期せぬものでした。私はxmlparserv2に検証パーサーがあることを知っているので、xmlparserv2.jarの逆コンパイルされたXMLParserを見ました(私はOC4Jの作業以来私に持っています)。

逆コンパイルされたソースは以下のとおりです。ご覧のように、コンストラクターはデフォルトでは非検証パーサーとみなされます。 setPropertyを使用すると、ValidatingParserに切り替える必要がありますが、それは起こっていないからです。

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

私は逆コンパイルコード内のsetPropertyメソッドを見つけることができませんでした。それは珍しいですが、私はそれを調べていません。 xml検証を有効にするには、別のAPIメソッドを使用する必要があります。私はsetAttributeメソッドがあなたが望むことをすると信じています。

公共ボイドのsetAttributeは、(文字列S、オブジェクトobj)は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); 
} 

私は同じパーサを使用している知っているOC4Jにデプロイされたアプリケーションでそれを使用しています。 コード例は

のDocumentBuilderFactory工場の下に示されている= 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));

これが役立ちます。

関連する問題