如何在Weblogic中校验及解释XML文件

来源:互联网 发布:centos 6.5 中文乱码 编辑:程序博客网 时间:2024/05/24 05:41

如何在Weblogic中校验及解释XML文件

前些天项目中要用到XML的校验及解释,于是本人写了一个校验器。在本地测试没有问题,但是到了Weblogic 中时,程序出了一点问题,后来找了一些资料才搞定。问题是JAXP方面的。

校验类如下(只有主要代码可能需要调试):

import org.apache.log4j.Logger;

import org.jdom.Document;

import org.jdom.input.SAXBuilder;

import org.jdom.output.XMLOutputter;

 

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import java.io.*;

 

public class DefaultParser {

    public static final String SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";

    public static final String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";

    public static final String SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";

private static Logger log = Logger.getLogger(DefaultParser.class);

 

    public boolean validate(InputStream in, InputStream schema, ErrorHandle errorHandle)

            throws Exception {

        log.debug("DefaultParser.validate() begin:");

        boolean result = false;

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        factory.setNamespaceAware(true);

        factory.setValidating(true);

        factory.setAttribute(SCHEMA_LANGUAGE, XML_SCHEMA);

        factory.setAttribute(SCHEMA_SOURCE, schema);

        DocumentBuilder parser = factory.newDocumentBuilder();

        parser.setErrorHandler(errorHandle);

 

        parser.parse(in);

 

        if (errorHandle.getMsgList().size() == 0) {

            result = true;

        }

        log.debug("DefaultParser.validate() result:" + result);

        return result;

    }

}

以上代码在IDE中调试没有任何问题,也能正确的校验出XML的错误,但程序发布到Weblogic中运行时,出现非法参数错误,主要是因为DocumentBuilderFactory使用了Weblogic自带的实现类。而在本地测试时使用的是xerces中的实现类(org.apache.xerces.jaxp.DocumentBuilderFactoryImpl)。看看DocumentBuilderFactory.newInstance()原代码可以看出默认的实现类应该是Sun的实现类(org.apache.crimson.jaxp.DocumentBuilderFactoryImpl)。所以实现类在不同的环境下是不同的,由于没有搞清楚,如何怎么配置或指定实现类,因此只好直接使用了测试环境下可以运行情况下的类。修改以上代码中的如下行:

        DocumentBuilderFactory factory = new org.apache.xerces.jaxp.DocumentBuilderFactoryImpl();

 

修改后的校验方法如下:

    public boolean validate(InputStream in, InputStream schema, ErrorHandle errorHandle)

            throws Exception {

        log.debug("DefaultParser.validate() begin:");

        boolean result = false;

        DocumentBuilderFactory factory = new org.apache.xerces.jaxp.DocumentBuilderFactoryImpl();

        factory.setNamespaceAware(true);

        factory.setValidating(true);

        factory.setAttribute(SCHEMA_LANGUAGE, XML_SCHEMA);

        factory.setAttribute(SCHEMA_SOURCE, schema);

        DocumentBuilder parser = factory.newDocumentBuilder();

        parser.setErrorHandler(errorHandle);

 

        parser.parse(in);

 

        if (errorHandle.getMsgList().size() == 0) {

            result = true;

        }

        log.debug("DefaultParser.validate() result:" + result);

        return result;

    }

 

我知道有更好的解决方法,希望大家指正。谢谢

原创粉丝点击