java中实现xml schema 验证文件

4 篇文章 0 订阅
2 篇文章 0 订阅

XML 是可扩展标记语言,也就是说其中的标记我们可以按照我们的意愿生成,只要符合语法规则就认为是合法的。

但是很多情况下我们需要根据一定的验证规则对xml 文档实施限制。当我们书写一个xml 文档的时候,通过验证文档对其进行验证,可以保证所书写的文档是合法合理的。这样我们的程序才可以对其进行适当的操作。不然随意写一个符合语法的xml 文档,我们的程序显然不能总是能对其进行操作。

验证文档对所书写的xml 文档进行合理合法的验证,验证文档有两种格式,一种为dtd ,一种为xsd (schema 形式)。

Xsd 文档主要起一个验证作用!

我们可以在操作一个传输过来的,或者新生成的xml 文档先进行验证,然后再进行解析,这样可以保证操作成功。

在此,我们使用schema 格式的文档对xml 进行验证。

<? xml version = "1.0" encoding = "UTF-8" ?>

<!--W3C Schema generated by XMLSpy v2008 (http://www.altova.com)-->

< xs:schema xmlns = "http://www.frank.com"

xmlns:xs = "http://www.w3.org/2001/XMLSchema" targetNamespace = "http://www.frank.com" elementFormDefault ="qualified" >

  < xs:element name = "students" >

  < xs:complexType >

   < xs:sequence >

    < xs:element ref = "student" maxOccurs = "unbounded" />

   </ xs:sequence >

  </ xs:complexType >

  </ xs:element >

  < xs:element name = "student" >

  < xs:complexType >

   < xs:sequence >

    < xs:element ref = "name" />

    < xs:element ref = "age" />

   </ xs:sequence >

  </ xs:complexType >

  </ xs:element >

  < xs:element name = "name" type = "xs:string" />

  < xs:element name = "age" type = "xs:byte" />

</ xs:schema >

 

 

<? xml version = "1.0" encoding = "UTF-8" ?>

< my:students xmlns:my = "http://www.frank.com" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" >

  < my:student >

  < my:name > tom </ my:name >

  < my:age > 23 </ my:age >

  </ my:student >

  < my:student >

  < my:name > mike </ my:name >

  < my:age > 23 </ my:age >

  </ my:student >

</ my:students >

 

package test;

 

import java.io.File;

import java.io.IOException;

import java.net.URL;

 

import javax.xml.transform.Source;

import javax.xml.transform.stream.StreamSource;

import javax.xml.validation.Schema;

import javax.xml.validation.SchemaFactory;

import javax.xml.validation.Validator;

 

import org.xml.sax.SAXException;

 

public class TestXML {

 

    /**

      * @param args

      */

    public static void main(String[] args) throws SAXException, IOException {

       // 建立 schema 工厂

       SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

       // 建立验证文档文件对象,利用此文件对象所封装的文件进行 schema 验证

       File schemaFile = new File("C:/Documents and Settings/pengch/workspace/xmlschema/test/students.xsd");

       // 利用 schema 工厂,接收验证文档文件对象生成 Schema 对象

       Schema schema = schemaFactory.newSchema(schemaFile);

       // 通过 Schema 产生针对于此 Schema 的验证器,利用 students.xsd 进行验证

       Validator validator = schema.newValidator();

       // 得到验证的数据源,就是 students.xml

       Source source = new StreamSource("C:/Documents and Settings/pengch/workspace/xmlschema/test/students.xml");

       // 开始验证,成功输出 success!!! ,失败输出 fail

       try {

           validator.validate(source);

           System.out.println("success!!!");

       } catch (Exception ex) {

           System.out.println("fail");

       }

 

    }

    }

 

抽象一下:

 

 

 

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.xml.sax.ErrorHandler;

import org.xml.sax.SAXException;

import org.xml.sax.SAXParseException;

 

public class DefaultErrorHandler implements ErrorHandler {

 

    protected static Log logger = LogFactory.getLog(DefaultErrorHandler.class);

   

    public void error(SAXParseException exception) throws SAXException {

    if(logger.isErrorEnabled()) {

        logger.error("XML file is invalid", exception);

    }

   

    throw new SAXException(exception);

    }

 

    public void fatalError(SAXParseException exception) throws SAXException {

    if(logger.isErrorEnabled()) {

        logger.error("XML file is invalid", exception);

    }

   

    throw new SAXException(exception);

    }

 

    public void warning(SAXParseException exception) throws SAXException {

    if(logger.isWarnEnabled()) {

        logger.warn("Warning", exception);

    }

    exception.printStackTrace();

    }

}

 

 

import java.io.IOException;

import java.io.InputStream;

 

import javax.xml.XMLConstants;

import javax.xml.transform.stream.StreamSource;

import javax.xml.validation.Schema;

import javax.xml.validation.SchemaFactory;

import javax.xml.validation.Validator;

 

import org.xml.sax.ErrorHandler;

import org.xml.sax.SAXException;

 

 

public class DefaultSchemaValidator extends 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));

    }

   

    /**

         * 验证给定的 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));

    }

}

 

import java.io.IOException;

import java.io.InputStream;

 

import org.xml.sax.ErrorHandler;

import org.xml.sax.SAXException;

 

 

public abstract class SchemaValidator {

    public abstract void validate(InputStream xmlStream, ErrorHandler errorHandler) throws SAXException, IOException;

    public void validate(InputStream xmlStream) throws SAXException, IOException {

    validate(xmlStream, new DefaultErrorHandler());

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 可以使用 Java API for XML Processing (JAXP) 的 Validation API 对 XML 文件进行格式验证。具体实现步骤如下: 1. 创建一个 SAXParserFactory 实例,用于创建 SAXParser。 2. 设置 SAXParserFactory 的属性,使其支持 XML Schema 验证。 3. 创建一个 SAXParser 实例。 4. 实现一个 DefaultHandler,用于处理 SAX 事件。 5. 调用 SAXParser.parse() 方法,将 XML 文件解析为 SAX 事件流,并将 DefaultHandler 作为解析器的回调函数。 6. 如果 XML 文件格式不符合指定的 XML Schema,则会抛出 SAXException 异常。 下面是一个简单的示例代码,用于验证一个 XML 文件是否符合指定的 XML Schema: ```java import javax.xml.XMLConstants; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class XmlValidator extends DefaultHandler { private boolean isValid = true; public boolean validate(String xmlFilePath, String xsdFilePath) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware(true); factory.setValidating(true); SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schema = schemaFactory.newSchema(new File(xsdFilePath)); factory.setSchema(schema); SAXParser parser = factory.newSAXParser(); parser.parse(new File(xmlFilePath), this); } catch (Exception e) { isValid = false; } return isValid; } @Override public void error(SAXParseException e) throws SAXException { isValid = false; } @Override public void fatalError(SAXParseException e) throws SAXException { isValid = false; } } ``` 在上述代码,validate() 方法接受两个参数,分别是要验证XML 文件路径和 XML Schema 文件路径。如果 XML 文件符合指定的 XML Schema,将返回 true,否则返回 false。如果 XML 文件格式不符合指定的 XML Schema,将抛出 SAXException 异常,isValid 属性将被设置为 false。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值