dom4j通过dtd或者schema验证xml

自己摸索写了个验证xml的类 可能还存在缺陷 先记录下

  1. /**
  2.  * 本类用于验证xml有效性
  3.  * 
  4.  * @author xxx时间:2008-7-25 14:34
  5.  */
  6. public class XMLValidation {
  7.     public static final int Monde_DTD = 0; // DTD形式验证
  8.     public static final int Monde_Schema = 1; // Schema验证
  9.     /**
  10.      * 
  11.      * @param xmlFile
  12.      *            xml文件路径
  13.      * @param validationFile
  14.      *            校验文件路径
  15.      * @param monde
  16.      *            校验类型
  17.      * @return 校验是否成功
  18.      */
  19.     public static boolean testXMLFile(String xmlFile, String validationFile,
  20.             int monde) {
  21.         boolean flag = true;
  22.         if (monde == Monde_DTD) {// 如果是dtd校验调用校验dtd的方法
  23.             flag = testXMLByDTD(xmlFile, validationFile);
  24.         } else if (monde == Monde_Schema) {// 如果是xsd校验调用校验xsd的方法
  25.             flag = testXMLByXsd(xmlFile, validationFile);
  26.         } else {
  27.             flag = false;
  28.         }
  29.         return flag;
  30.     }
  31.     /**
  32.      * 校验 dtd 的方法
  33.      * 
  34.      * @param xmlFile
  35.      *            xml文件路径
  36.      * @param validationFile
  37.      *            校验文件路径
  38.      * @return 校验是否成功
  39.      */
  40.     private static boolean testXMLByDTD(final String xmlFile,
  41.             final String validationFile) {
  42.         /*
  43.          * 此类实体包括在 DTD 内引用的外部 DTD
  44.          * 子集和外部参数实体(无论哪种情形,仅在在解析器都读取外部参数实体时)和在文档元素内引用的外部通用实体(如果解析器读取外部通用实体)
  45.          */
  46.         EntityResolver resolver = new EntityResolver() {// 应用程序解析外部实体
  47.             public InputSource resolveEntity(String publicId, String systemId) {
  48.                 InputStream is = null;
  49.                 try {
  50.                     is = new FileInputStream(validationFile);// 读取dtd文档
  51.                 } catch (FileNotFoundException e) {
  52.                     e.printStackTrace();
  53.                     return null;
  54.                 }
  55.                 InputSource ins = new InputSource(is);
  56.                 ins.setPublicId(publicId);
  57.                 ins.setSystemId(systemId);
  58.                 return ins;// 返回 InputSource实例
  59.             }
  60.         };
  61.         SAXReader reader = new SAXReader(true);
  62.         reader.setEntityResolver(resolver); // 向SAX 驱动器注册一EntityResolver个实例。
  63.         boolean flag = validate(xmlFile, reader);// 调用验证方法
  64.         return flag;
  65.     }
  66.     /**
  67.      * 验证 xsd 方法
  68.      * 
  69.      * @param xmlFile
  70.      *            xml文件路径
  71.      * @param validationFile
  72.      *            校验文件路径
  73.      * @return 校验是否成功
  74.      */
  75.     private static boolean testXMLByXsd(final String xmlFile,final String validationFile) {
  76.         SAXReader reader = new SAXReader(true);// 创建SAXReader对象并制定需要验证
  77.                                                // 也可通过reader.setValidation(true)来指定
  78.         try {
  79.             reader.setFeature("http://xml.org/sax/features/validation"true);// 设置功能标志的值name -功能名称,它是一个完全限定 URI。value - 请求的功能值(true 或false)。
  80.             reader.setFeature("http://apache.org/xml/features/validation/schema"true);
  81.             reader.setFeature("http://apache.org/xml/features/validation/schema-full-checking",true);
  82.             reader.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",validationFile);// 设置属性的值 name - 属性名称,它是一个完全限定 URI。value - 请求的属性值
  83.         } catch (SAXException e) {
  84.             e.printStackTrace();
  85.             return false;// 如果捕获异常 则返回false
  86.         }
  87.         boolean flag = validate(xmlFile, reader);// 调用验证方法
  88.         return flag;
  89.     }
  90.     /**
  91.      * 
  92.      * @param xmlFile xml文件路径
  93.      * @param validationFile 校验文件路径
  94.      * @param reader  SAXReader 对象
  95.      * @return 校验是否成功
  96.      */
  97.     private static boolean validate(final String xmlFile, final SAXReader reader) {
  98.         XMLErrorHandler errorHandle = new XMLErrorHandler();// 错误处理类实例
  99.         reader.setErrorHandler(errorHandle);// 向 XML 阅读器注册一个实例
  100.         File file = new File(xmlFile);
  101.         InputStream is = null;
  102.         if (file.exists() && file.isFile()) {
  103.             try {
  104.                 is = new FileInputStream(file);// 读取xml
  105.                 InputStreamReader in = new InputStreamReader(is"utf-8");
  106.                 reader.read(in);
  107.             } catch (FileNotFoundException e) {// 如果出现异常返回false
  108.                 e.printStackTrace();
  109.                 return false;
  110.             } catch (UnsupportedEncodingException e) {
  111.                 e.printStackTrace();
  112.                 return false;
  113.             } catch (DocumentException e) {
  114.                 e.printStackTrace();
  115.                 return false;
  116.             }
  117.         } else
  118.             return false;
  119.         if (errorHandle.getErrors().hasContent()) {// 如果错误处理类实例中包含错误信息返回false;
  120.             return false;
  121.         }
  122.         return true;
  123.     }
  124. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值