论坛首页 Java企业应用论坛

如何使用schema对xml进行验证

浏览 5617 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-05-08  
大家在实际项目中做XML解析前,都采用什么方法进行验证?如果我想用schema对xml进行验证,不知道使用Digester可以不可以,网上这方面的DEMO很少,大部分都是基于规则集,但是这样不能判断数据格式的正确性,如果能使用schema的话,就不仅可以验证数据格式而且还可以验证类型的正确性。
   发表时间:2008-05-08  
jaxb2.0 validation
0 请登录后投票
   发表时间:2008-05-08  
已经找到解决方案,但是digester好像不行。
dom4j解决方案:


SAXReader reader = new SAXReader();

		reader.setValidation(true);
		try {
			reader.setFeature("http://xml.org/sax/features/validation", true);
			reader.setFeature("http://apache.org/xml/features/validation/schema", true);

			reader.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",
			                                "d:\\requestinfo.xsd");

			XMLErrorHandler errorHandler = new XMLErrorHandler();
			reader.setErrorHandler(errorHandler);

			Document document = reader.read("d:\\requestInfo.xml");
			XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());
			if (errorHandler.getErrors().hasContent()) {
			        writer.write(errorHandler.getErrors());
			} else {
			        System.out.println("validate success.");
			}
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

0 请登录后投票
   发表时间:2008-05-08  
不知道你用是不是jdk1.5以上,如果是可以试试jdk提供的Schema,我直接拷贝项目中的代码了。
public class DefaultSchemaValidator implements SchemaValidator {

    private InputStream schemaStream;
    
    /**
     * 构造函数
     * @param schemaStream schema文件输入流
     */
    public DefaultSchemaValidator(InputStream schemaStream) {
	this.schemaStream = schemaStream;
    }
    
    /**
     * 构造函数
     * @param clz 
     * @param schemaFile schema文件
     */
    public DefaultSchemaValidator(Class clz, String schemaFile) {
	this.schemaStream = clz.getResourceAsStream(schemaFile);
    }
    
    public DefaultSchemaValidator(ClassLoader classLoader, String schemaFile) {
	this.schemaStream = classLoader.getResourceAsStream(schemaFile);
    }
    
    public void validate(InputStream xmlStream, ErrorHandler errorHandler) throws SAXException, IOException {
	Schema schema = createSchema(schemaStream);
	Validator validator = schema.newValidator();
	validator.setErrorHandler(errorHandler);
	validator.validate(new StreamSource(xmlStream));
    }

    public void validate(InputStream xmlStream) throws SAXException, IOException {
	validate(xmlStream, new DefaultErrorHandler());
    }
    
    /**
         * 验证给定的xml是否合法
         * 
         * @return
         * @throws SAXException
         */
    protected Schema createSchema(InputStream schemaStream) throws SAXException {
	SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
	return schemaFactory.newSchema(new StreamSource(schemaStream));
    }
}
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics