xml 校验
- package sax.parsing;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import javax.xml.XMLConstants;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.parsers.SAXParser;
- import javax.xml.parsers.SAXParserFactory;
- import javax.xml.validation.Schema;
- import javax.xml.validation.SchemaFactory;
- import org.dom4j.DocumentException;
- import org.dom4j.io.SAXReader;
- import org.dom4j.io.SAXValidator;
- import org.testng.annotations.Test;
- import org.w3c.dom.Document;
- import org.xml.sax.InputSource;
- import org.xml.sax.SAXException;
- import org.xml.sax.SAXParseException;
- import org.xml.sax.XMLReader;
- import org.xml.sax.helpers.DefaultHandler;
- import org.xml.sax.helpers.XMLReaderFactory;
- public class ErrorProcessor extends DefaultHandler {
- @Override
- public void warning(SAXParseException exception) throws SAXException {
- System.out.println("触发警告:");
- System.err.println("warning: " + getLocationString(exception) + ": " + exception.getMessage());
- }
- @Override
- public void error(SAXParseException exception) throws SAXException {
- System.out.println("触发错误:");
- System.err.println("error: " + getLocationString(exception) + ": " + exception.getMessage());
- }
- @Override
- public void fatalError(SAXParseException exception) throws SAXException {
- System.out.println("触发致命错误:");
- System.err.println("fatal error: " + getLocationString(exception) + ": " + exception.getMessage());
- }
- private String getLocationString(SAXParseException ex) {
- StringBuffer buffer = new StringBuffer();
- String publicId = ex.getPublicId();
- if (publicId != null) {
- buffer.append(publicId);
- buffer.append(" ");
- }
- String systemId = ex.getSystemId();
- if (systemId != null) {
- buffer.append(systemId);
- buffer.append(':');
- }
- buffer.append(ex.getLineNumber());
- buffer.append(':');
- buffer.append(ex.getColumnNumber());
- return buffer.toString();
- }
- @Override
- public void endElement(String uri, String localName, String qName) throws SAXException {
- System.out.println("</" + qName + ">");
- }
- /**
- * 在DOM文件构建工厂中设置校验Schema文件
- * @throws IOException
- * @throws SAXException
- * @throws ParserConfigurationException
- */
- @Test
- public void parseWithSchema() throws SAXException, IOException, ParserConfigurationException {
- System.out.println("========== parseWithSchema() start ===============");
- SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
- Schema schema = schemaFactory.newSchema(new File("src/students.xsd"));
- DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
- builderFactory.setSchema(schema);
- DocumentBuilder builder = builderFactory.newDocumentBuilder();
- builder.setErrorHandler(new ErrorProcessor());
- Document doc = builder.parse("src/students.xml");
- System.out.println("========== parseWithSchema() end ===============");
- }
- @Test
- public void read() throws FileNotFoundException, IOException, SAXException {
- System.out.println("========== read() start (仅语法校验) ===============");
- XMLReader xmlReader = XMLReaderFactory.createXMLReader();
- xmlReader.setFeature("http://xml.org/sax/features/validation", true);
- xmlReader.setFeature("http://xml.org/sax/features/namespaces", true);
- xmlReader.setErrorHandler(new ErrorProcessor());
- xmlReader.parse(new InputSource(new FileInputStream("src/students.xml")));
- System.out.println("========== read() end ===============");
- }
- @Test
- public void saxValidate() throws ParserConfigurationException, SAXException, DocumentException, FileNotFoundException, IOException {
- System.out.println("========== saxValidate() start ===============");
- SAXParserFactory parserFactory = SAXParserFactory.newInstance();
- parserFactory.setValidating(true); // 等价于 xmlReader.setFeature("http://xml.org/sax/features/validation", true);
- parserFactory.setNamespaceAware(true); // 等价于 reader.setFeature("http://xml.org/sax/features/namespaces",true);
- SAXParser parser = parserFactory.newSAXParser();
- parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
- parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", "file:/D:/eclipse-luna-jee/workspace/xsl_trans/src/students.xsd");
- XMLReader xmlReader = parser.getXMLReader();
- xmlReader.setErrorHandler(new ErrorProcessor()); // 错误时触发
- //xmlReader.setContentHandler(new ErrorProcessor()); // 标签开始、结束等事件时触发
- xmlReader.parse(new InputSource(new FileInputStream("src/students.xml")));
- System.out.println("========== saxValidate() end ===============");
- }
- @Test
- public void dom4jValidate() throws ParserConfigurationException, SAXException, DocumentException, FileNotFoundException, IOException {
- System.out.println("========== dom4jValidate() start ===============");
- SAXParserFactory parserFactory = SAXParserFactory.newInstance();
- parserFactory.setValidating(true); // 等价于 xmlReader.setFeature("http://xml.org/sax/features/validation", true);
- parserFactory.setNamespaceAware(true); // 等价于 reader.setFeature("http://xml.org/sax/features/namespaces",true);
- SAXParser parser = parserFactory.newSAXParser();
- parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
- parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", "file:/D:/eclipse-luna-jee/workspace/xsl_trans/src/students.xsd");
- XMLReader xmlReader = parser.getXMLReader();
- /*
- * dom4j的校验处理过程
- * org.dom4j.io.SAXReader
- * org.dom4j.Document
- * org.dom4j.io.SAXValidator
- */
- SAXReader reader = new SAXReader();
- org.dom4j.Document doc = reader.read(new File("src/students.xml"));
- SAXValidator validator = new SAXValidator(xmlReader);
- validator.setErrorHandler(new ErrorProcessor());
- validator.validate(doc);
- System.out.println("========== dom4jValidate() end ===============");
- }
- }
- 输出:
========== parseWithSchema() start ===============
error: file:///D:/eclipse-luna-jee/workspace/xsl_trans/src/students.xml:4:41: cvc-complex-type.3.2.2: Attribute 'attr_test' is not allowed to appear in element 'student'.触发错误:
触发错误:
error: file:///D:/eclipse-luna-jee/workspace/xsl_trans/src/students.xml:10:40: cvc-complex-type.2.4.a: Invalid content was found starting with element 'elem_test1'. One of '{student}' is expected.
========== parseWithSchema() end ===============
========== read() start (仅语法校验) ===============
触发错误:
error: 3:10: Document is invalid: no grammar found.
触发错误:
error: 3:10: Document root element "students", must match DOCTYPE root "null".
========== read() end ===============
========== saxValidate() start ===============
触发错误:
error: 4:41: cvc-complex-type.3.2.2: Attribute 'attr_test' is not allowed to appear in element 'student'.
触发错误:
error: 10:40: cvc-complex-type.2.4.a: Invalid content was found starting with element 'elem_test1'. One of '{student}' is expected.
========== saxValidate() end ===============
========== dom4jValidate() start ===============
触发错误:
error: file:///D:/eclipse-luna-jee/workspace/xsl_trans/src/students.xml:3:41: cvc-complex-type.3.2.2: Attribute 'attr_test' is not allowed to appear in element 'student'.
触发错误:
error: file:///D:/eclipse-luna-jee/workspace/xsl_trans/src/students.xml:9:39: cvc-complex-type.2.4.a: Invalid content was found starting with element 'elem_test1'. One of '{student}' is expected.
========== dom4jValidate() end ===============
students.xml
- <?xml version="1.0" encoding="utf-8" ?>
- <students>
- <student sn="01" attr_test="errorAttr"><!-- 在student与name父子元素节点之间的是一个文本节点('\n\t\t') -->
- <name>张三</name>
- <age>18</age>
- <score>100</score>
- </student>
- <elem_test1 attr_test1="errorAttr1" />
- <student sn="02">
- <name>lisi</name>
- <age>20</age>
- <score>100</score>
- </student>
- <elem_test2 attr_test1="errorAttr2" />
- </students>
students.xsd
- <?xml version="1.0" encoding="utf-8" ?>
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
- <xs:element name="students">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="student" type="studentType" maxOccurs="unbounded" />
- </xs:sequence>
- </xs:complexType>
- </xs:element>
- <xs:complexType name="studentType">
- <xs:sequence>
- <xs:element name="name" type="xs:token" />
- <xs:element name="age" type="xs:positiveInteger" />
- <xs:element name="score" type="xs:float" />
- </xs:sequence>
- <xs:attribute name="sn" type="xs:token" />
- </xs:complexType>
- </xs:schema>
xml 校验的更多相关文章
- winform总结4> 工欲善其事,必先利其器之xml校验
@echo 根据xml自动生成xml @echo 当前路径包含空格会导致执行失败 ::pause @echo off set path=%~dp0 for /r %path% %%i in (*.xm ...
- 二十二 XML校验器
Struts2提供的校验器及其规则:
- struts_24_基于XML校验的规则、特点
当为某个action提供了ActionClassName-validation.xml和ActionClassName-ActionName-validation.xml两种规则的校验文件时,系统按下 ...
- 二十一 Struts的数据校验两种方式:手动编码和xml校验
数据的校验: 一.前台校验:JS校验 JS的校验不是必须的,JS可以被绕行,可以提升用户体验 二.后台校验:编码校验 必须的校验 三.校验的方式: 手动编码(不建议使用) 配置文件(支持) 手动编码的 ...
- dubbo配置文件xml校验报错
配置dubbo服务xml后,程序能正常执行,但validate会出现一些异常: Multiple annotations found at this line: - cvc-complex-type. ...
- eclipse spring 配置文件xml校验时,xsd报错
1.情景展示 eclipse中,spring配置文件报错信息如下: 配置文件头部引用信息为: <?xml version="1.0" encoding="UTF ...
- Struts2 基于XML校验(易百教程)
以下是的各类字段级和非字段级验证在Struts2列表: date validator: <field name="birthday"> <field-valida ...
- struts2视频学习笔记 22-23(基于XML配置方式实现对action的所有方法及部分方法进行校验)
课时22 基于XML配置方式实现对action的所有方法进行校验 使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类 ...
- 【Struts2学习笔记(11)】对action的输入校验和XML配置方式实现对action的全部方法进行输入校验
在struts2中,我们能够实现对action的全部方法进行校验或者对action的指定方法进行校验. 对于输入校验struts2提供了两种实现方法: 1. 採用手工编写代码实现. 2. 基于XML配 ...
随机推荐
- javascript中uber实现子类访问父类成员
function Animal(){} Animal.prototype={ name:"animal", toString:function(){ console.log(thi ...
- screen 基础用法(转)
####################### 屏幕分割 ######################## 1. screen2. Ctrl-a c # create a new screen3 ...
- Leetcode720.Longest Word in Dictionary词典中最长的单词
给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. 若无答案,则返回 ...
- Leetcode695.Max Area of Island岛屿的最大面积
给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被水包围着. 找到给定的二维数组中 ...
- BZOJ2770: YY的Treap
原本看标题还以为是treap的题,但是实际上是线段树. 求两点的LCA相当于求区间priority最小值的位置. 然后就可以离线先离散化然后建树做了. 记录的minpos是线段树上叶子结点的节点编号. ...
- Mysql主从安装配置
Mysql主从安装配置 环境: 主从服务器上的MySQL数据库版本同为5.1.34 主机IP:192.168.0.1 从机IP:192.168.0.2 一. MySQL主服务器配置 1.编辑配置 ...
- Thrift源码分析(一)-- 基本概念
我所在的公司使用Thrift作为基础通信组件,相当一部分的RPC服务基于Thrift框架.公司的日UV在千万级别,Thrift很好地支持了高并发访问,并且Thrift相对简单地编程模型也提高了服务地开 ...
- 【JZOJ4811】【NOIP2016提高A组五校联考1】排队
题目描述 输入 输出 样例输入 5 4 1 2 1 3 3 4 3 5 1 4 2 4 1 2 2 5 样例输出 3 1 1 2 数据范围 样例解释 解法 可推知原树可以转换为一个序列,即优先序列: ...
- Tumblr,instapaper分享
<div id="bshare-custom"> <a title="分享到Tumblr" id="bshare-tumblr&qu ...
- Django1.11使用命令makemigrations提示No Changes
在项目中,遇到models模型变动,变动后合并发生问题,故当时做了删除应用文件夹下migrations文件,由于数据库里无较多新数据,故删除后重建,但重建后执行模型合并操作结果为No Changes, ...