我正在尝试使用 SAX/DOM 解析器针对 xsd 验证 xml,这两个文件都存储为数据库中的 CLOB 列。我需要报告所有验证错误,并且根据本论坛早期帖子中的一些有用建议/代码,我使用以下代码来验证和报告错误。
代码工作正常,但对于大文件,它永远不会超过一定数量的错误,即 getNumMessages() (XMLParseException) 永远不会返回大于 100 的值,因此限制了验证错误的输出。任何建议更改代码或替代方案的指针都将非常有帮助。
数据库版本:Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
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';
谢谢。