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

如何在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;

    }

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值