使用XML SCHEMA 验证xml文件

  1. package cn.com.starit.DB;   
  2.   
  3. import java.io.File;   
  4. import java.io.FileWriter;   
  5.   
  6. import javax.xml.parsers.SAXParser;   
  7. import javax.xml.parsers.SAXParserFactory;   
  8.   
  9. import org.dom4j.Document;   
  10. import org.dom4j.io.OutputFormat;   
  11. import org.dom4j.io.SAXReader;   
  12. import org.dom4j.io.SAXValidator;   
  13. import org.dom4j.io.XMLWriter;   
  14. import org.dom4j.util.XMLErrorHandler;   
  15.   
  16. public class ValidateXML {   
  17.  public static void validateXMLByXSD(String xsdFileName,String xmlFileName) {   
  18.         try {   
  19.             //创建默认的XML错误处理器   
  20.             XMLErrorHandler errorHandler =  new XMLErrorHandler();   
  21.               
  22.             //获取基于 SAX 的解析器的实例   
  23.             SAXParserFactory factory = SAXParserFactory.newInstance();   
  24.             //解析器在解析时验证 XML 内容。   
  25.             factory.setValidating(true);   
  26.             //指定由此代码生成的解析器将提供对 XML 名称空间的支持。   
  27.             factory.setNamespaceAware(true);   
  28.             //使用当前配置的工厂参数创建 SAXParser 的一个新实例。   
  29.             SAXParser parser = factory.newSAXParser();   
  30.             //创建一个读取工具   
  31.             SAXReader xmlReader = new SAXReader();   
  32.             //获取要校验xml文档实例   
  33.             Document xmlDocument = (Document) xmlReader.read(new File(xmlFileName));   
  34.             //设置 XMLReader 的基础实现中的特定属性。核心功能和属性列表可以在 [url]http://sax.sourceforge.net/?selected=get-set[/url] 中找到。   
  35.             parser.setProperty(   
  36.                     "http://java.sun.com/xml/jaxp/properties/schemaLanguage",   
  37.                     "http://www.w3.org/2001/XMLSchema");   
  38.             parser.setProperty(   
  39.                     "http://java.sun.com/xml/jaxp/properties/schemaSource",   
  40.                     "file:" + xsdFileName);   
  41.             //创建一个SAXValidator校验工具,并设置校验工具的属性   
  42.             SAXValidator validator = new SAXValidator(parser.getXMLReader());   
  43.             //设置校验工具的错误处理器,当发生错误时,可以从处理器对象中得到错误信息。   
  44.             validator.setErrorHandler(errorHandler);                       
  45.                
  46.             //校验   
  47.             validator.validate(xmlDocument);   
  48.             OutputFormat format = OutputFormat.createPrettyPrint();   
  49.             format.setEncoding("UTF-8");    
  50.             XMLWriter writer = new XMLWriter( new  
  51.             FileWriter(new File("d:\\err.xml")), format);   
  52.   
  53.             //  TODO     XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());   
  54.             //如果错误信息不为空,说明校验失败,打印错误信息   
  55.             if (errorHandler.getErrors().hasContent()) {   
  56.                 System.out.println("XML文件通过XSD文件校验失败!");   
  57.                 // ** 将document中的内容写入文件中 *//*   
  58.                 writer.write(errorHandler.getErrors()); //writer.write(parse(document));               
  59.                 writer.close();                  
  60.             } else {   
  61.                 System.out.println("Good! XML文件通过XSD文件校验成功!");   
  62.             }   
  63.         } catch (Exception ex) {   
  64.             System.out.println("XML文件: " + xmlFileName + " 通过XSD文件:" + xsdFileName + "检验失败。\n原因: " + ex.getMessage());   
  65.             ex.printStackTrace();   
  66.         }   
  67.     }   
  68.   
  69.   public static void main(String[] args) {   
  70.        String xsdpath = "e:\\test1.xsd";   
  71.        String xmlpath = "e:\\test1.xml";   
  72.        validateXMLByXSD(xsdpath,xmlpath);   
  73.   }   
  74.   
  75. ///************验证字符串[xml 字符串 转化成 输入流] start****************/   
  76. //   
  77.  xmlMsg为xml文档<?xml version="1.0" encoding="GBK"?>........   
  78. //InputStream in = new ByteArrayInputStream(xmlMsg);    
  79. //   
  80. //然后将上面的reader.read("message.xml") 改为 reader.read(in)就OK了。   
  81. //   
  82. ///************验证字符串[xml 字符串 转化成 输入流] end ****************/   
  83. }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[实验目的] 1、学习如何使用XMLSPY集成开发环境完成XML Schema相关的开发工作。 2、掌握XML Schema与DTD之间的区别,能够完成两者之间的转换;掌握在XML Schema中如何定义元素和属性,如何使用限制、列表和合并派生自己的简单数据类型,如何定义复杂数据类型,全局/局部元素和数据类型之间的区别;如何将XML Schema文档关联到XML实例数据文档,并完成文档的有效性验证。 3、掌握如何准确定义数据之间的参照完整性约束,如何在模式中使用多态性支持,如何在文档中定义空值等等。 [实验内容和步骤] 1、使用XMLSPY集成开发环境,新建XML Schema文档,在各种不同的编辑视图中尝试采用不同的方式完成XML Schema文档的编辑和查看;并使用XMLSPY提供的便利,建立XMLSchema两者之间的关联,进行XML文档的良构以及有效性验证。 2、严格按照下图给出的文档模型,在XML Schema编辑环境的Schema视图中完成book.xsd的编写(不要使用Text视图进行编写): 在上图中,没有指定简单类型元素和属性的数据类型,请根据合理的情况,完成数据类型的创建(至少使用到限制方式中的三种以上的限制方面),请在IDE的Details视图->type和Facets中完成上述任务。 在上图中,有三个title元素分别表示book、section和figure的标题,请定义下述类型: titleType:1-100个字符的文本; bookTitleType:titleType类型限制派生的子类型,要求取枚举值“Data On the Web”、“TCP/IP Illustrated”等; sectionTitleType:titleType类型限制派生的子类型,要求必须形如“1.xxxx”、“1-1.xxxx”等等(表示第一节、第一节下面的第一节等等,注意section是递归的形式); figureTitleType:titleType类型限制派生的子类型,要求必须形如“1-1.xxxx” 、“1-1-1.xxxx”(表示第一节中的第一个图、第一节下面的第一节的第一个图等等); 然后编写book.xml,并使用多态性(即所有title的类型均为titleType,而数据实例中指明具体类型),请确保通过文档有效性验证。 3、在上次的DTD实验中,我们编写了SpyBase1.xml、SpyBase2.xml、以及SpyBase1.dtd和SpyBase2.dtd,这次需要完成SpyBase1.xsd和SpyBase2.xsd,建立模式与数据之间的关联,并进行文档有效性验证。在编写的XSD文档SpyBase1.xsd中,要求使用key/keyref描述数据的实体完整性以及数据之间的参照完整性(SpyBase2.xml不需要,因为已经使用嵌套消除了参照关系)。 [实验思考] 与ID/IDREF相比,key/keyref有哪些优点,在使用上有何不同? 假设SpyBase1.xml中的alias、mission、spy来自不同的命名空间中,如何在Schema中对其进行限定,请在XMLSPY中完成相应的xsd文档?修改SpyBase1.xml,并验证新的SpyBase1_2.xsd是否正确? [提交时间及内容] 最后提交时间 2013年?月?日 提交内容 提交book.xsd、book.xml使用多态)。 提交SpyBase1. xsd、SpyBase2. xsd。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值