0

SAX/DOM パーサーを使用して xsd に対して xml を検証しようとしています。両方のファイルが CLOB 列としてデータベースに格納されています。すべての検証エラーを報告する必要があり、このフォーラムの以前の投稿からの役立つアドバイス/コードに基づいて、次のコードを使用してエラーを検証および報告しました。

コードは問題なく動作しますが、大きなファイルの場合、特定の数のエラーを超えることはありません。つまり、getNumMessages() (XMLParseException) は 100 を超える値を返さないため、検証エラーの出力が制限されます。コードまたは代替の変更を提案するポインタは非常に役立ちます。

データベースのバージョン: Oracle Database 11g Enterprise Edition リリース 11.2.0.2.0 - 64 ビット製品

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED as package <package name>;
import java.net.*;
import java.io.*;
import java.util.*;
import java.sql.SQLException;
import oracle.sql.CLOB;
import oracle.xml.parser.schema.*;
import oracle.xml.parser.v2.*;
import org.w3c.dom.*;

public class XMLSchemaVal
{
    public static String validate(CLOB xmlDoc, CLOB xsdDoc)
    throws Exception
    {
     //Build Schema Object

    XSDBuilder builder = new XSDBuilder();
    Reader xsdInUnicodeFormat = xsdDoc.getCharacterStream();


    XMLSchema schemadoc = (XMLSchema)builder.build(xsdInUnicodeFormat, null);

    //Build XML Object
    Reader xmlInUnicodeFormat = xmlDoc.getCharacterStream();

    // Genereate the SAX

    SAXParser saxparser_doc = new SAXParser();

    // Set Schema Object for Validation

    saxparser_doc.setXMLSchema(schemadoc);
    saxparser_doc.setValidationMode(XMLParser.SCHEMA_VALIDATION);
    saxparser_doc.setPreserveWhitespace (true);

    String returnValue;

        try {
                saxparser_doc.parse (xmlInUnicodeFormat);
                returnValue = "The input XML parsed without errors.\n";
            }

        catch (XMLParseException se) {
                                        //returnValue = "Parser Exception: ";
                                        //for (int i=0 ; i < se.getNumMessages(); i++)
                                        //returnValue += "<LN: " + se.getLineNumber(i) + ">: " + se.getMessage(i);
                                        returnValue = "Parser Exception: " + se.getNumMessages();
                                      }

         catch (Exception e) {
                                returnValue = "NonParserException: " + e.getMessage();
                             }
         return returnValue;
    }
}

PL/SQLから上記ユーティリティを呼び出す関数

CREATE OR REPLACE FUNCTION F_XMLSCHEMAVALIDATION (P_XML IN clob ,P_XSD IN clob) RETURN VARCHAR2 IS
LANGUAGE JAVA NAME XMLSchemaVal.validate(oracle.sql.CLOB,oracle.sql.CLOB) return java.lang.String';

ありがとう。

4

1 に答える 1

0

SAXParser.setErrorHandler を使用して、発生したエラーを蓄積できるコールバック コードを登録することを検討しましたか?

http://docs.oracle.com/cd/E11882_01/appdev.112/e10769/oracle/xml/parser/v2/XMLParser.html#setErrorHandler_org_xml_sax_ErrorHandler_

于 2013-09-25T19:28:13.967 に答える