最近在看spring源码,涉及到xml文档的解析、xml文档的格式验证,发现自己对xml解析的基础较为薄弱,本篇博客复习下DOM方式解析xml(即spring解析xml的方式)。

DOM解析XML是将整个XML作为一个对象,占用内存较多。另外一个java官方的XML解析方式SAX是边扫描边解析,自顶向下依次解析,占用内存较少。

一、java实现对XML格式的验证

可以使用两种验证模式(DTD、XSD)保证XML文件格式正确,DTD和XSD均是XML约束描述语言,是XML文件的验证机制。本文以DTD为例。

DTD文件格式请参考:http://www..com/zhengcheng/p/4278899.html

看下面student.xml:

张三姓名>

男性别>

20年龄>

学生>

李四姓名>

女性别>

19年龄>

学生>

学生名册>

我们看到上面这个XML指定的DTD验证文件为student.dtd:

那么java DOM解析XML如何实现验证?

下面使用DOM解析student.xml:

public class test {

public static void main(String[] args) {

DocumentBuilderFactory buildFactory = DocumentBuilderFactory.newInstance();

//开启XML格式验证

buildFactory.setValidating(true);

try {

DocumentBuilder build = buildFactory.newDocumentBuilder();

//指定验证出错处理类MyErrorHandle

build.setErrorHandler(new MyErrorHandler());

//自定义解析方式,如果不设置,则使用默认实现

build.setEntityResolver(new MyResolveEntity());

Document doc = build.parse("student.xml");

getStudents(doc);

} catch (ParserConfigurationException e) {

e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

private static void getStudents(Document doc) {

Element root = doc.getDocumentElement();

NodeList nodeList = root.getElementsByTagName("学生");

for(int i=0;i

Node node = nodeList.item(i);

NamedNodeMap map = node.getAttributes();

System.out.println(map.item(0).getTextContent());

//子节点

NodeList childList = node.getChildNodes();

for(int j=0;j

Node childNode = childList.item(j);

System.out.println(childNode.getTextContent());

}

}

}

}

public class MyErrorHandler implements ErrorHandler{

@Override

public void warning(SAXParseException exception) throws SAXException {

// TODO Auto-generated method stub

}

@Override

public void error(SAXParseException exception) throws SAXException {

System.out.println("发生了错误!"+exception.getMessage());

}

@Override

public void fatalError(SAXParseException exception) throws SAXException {

// TODO Auto-generated method stub

}

}

public class MyResolveEntity implements EntityResolver{

@Override

public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {

return new InputSource("student.dtd");

//return null;

}

}

如果不设置setEntityResolver,则会使用XML中指定位置的DTD文件进行验证,

student.dtd即指定了验证文件的位置。

二、spring源码中对XML文件的验证的处理

在spring中,为网络地址:

/p>

"http://www.springframework.org/dtd/spring-beans.dtd">

publicId:-//SPRING//DTD BEAN//EN

systemId:http://www.springframework.org/dtd/spring-beans.dtd

如果设置了setEntityResolver,则会按照EntityResolver进行XML验证:先去项目中寻找spring-beans.xsd,如果未获取到则按照网络地址寻找。

以spring中 Spring-beans.dtd为例:

public class BeansDtdResolver implements EntityResolver {

private static final String DTD_EXTENSION = ".dtd";

private static final String DTD_NAME = "spring-beans";

private static final Log logger = LogFactory.getLog(BeansDtdResolver.class);

@Override

public InputSource resolveEntity(String publicId, String systemId) throws IOException {

if (logger.isTraceEnabled()) {

logger.trace("Trying to resolve XML entity with public ID [" + publicId +

"] and system ID [" + systemId + "]");

}

if (systemId != null && systemId.endsWith(DTD_EXTENSION)) {

int lastPathSeparator = systemId.lastIndexOf("/");

int dtdNameStart = systemId.indexOf(DTD_NAME, lastPathSeparator);

if (dtdNameStart != -1) {

String dtdFile = DTD_NAME + DTD_EXTENSION;

if (logger.isTraceEnabled()) {

logger.trace("Trying to locate [" + dtdFile + "] in Spring jar on classpath");

}

try {

Resource resource = new ClassPathResource(dtdFile, getClass());

InputSource source = new InputSource(resource.getInputStream());

source.setPublicId(publicId);

source.setSystemId(systemId);

if (logger.isDebugEnabled()) {

logger.debug("Found beans DTD [" + systemId + "] in classpath: " + dtdFile);

}

return source;

}

catch (IOException ex) {

if (logger.isDebugEnabled()) {

logger.debug("Could not resolve beans DTD [" + systemId + "]: not found in classpath", ex);

}

}

}

}

// Use the default behavior -> download from website or wherever.

return null;

}

}

java验证xml格式是否正确的是_spring源码附录(1)java实现对XML格式的验证相关推荐

  1. java报错找不到对象,使用Spring源码报错java:找不到类 InstrumentationSavingAgent的问题...

    使用Spring源码,报错java:找不到类 InstrumentationSavingAgent 报错如下: Error:(26, 38) java: 找不到符号 符号: 类 Instrumenta ...

  2. 基于java(springboot)酒店民宿客房管理系统源码成品(java毕业设计)

    基于java(springboot)酒店民宿客房管理系统 酒店民宿客房管理系统是基于java编程语言,mysql数据库,springboot框架和idea工具进行开发,本设计分为用户,商家,管理员三个 ...

  3. java汽车美容管理计算机毕业设计MyBatis+系统+LW文档+源码+调试部署

    java汽车美容管理计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 java汽车美容管理计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 本源码技术栈: 项目架构:B/S架构 ...

  4. SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转

    SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...

  5. [附源码]计算机毕业设计JAVA逸尘房屋销售管理系统

    [附源码]计算机毕业设计JAVA逸尘房屋销售管理系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(In ...

  6. [附源码]计算机毕业设计JAVA校园征兵及退役复原管理系统

    [附源码]计算机毕业设计JAVA校园征兵及退役复原管理系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe ...

  7. [附源码]计算机毕业设计JAVA领导干部听课评课管理系统

    [附源码]计算机毕业设计JAVA领导干部听课评课管理系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe( ...

  8. [附源码]计算机毕业设计JAVA校园超市进销存管理系统

    [附源码]计算机毕业设计JAVA校园超市进销存管理系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(I ...

  9. [附源码]计算机毕业设计JAVA社区健康服务平台管理系统lunwen

    [附源码]计算机毕业设计JAVA社区健康服务平台管理系统lunwen 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Ec ...

最新文章

  1. 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析
  2. with dlz mysql 条件_Flask Bind-DLZ + Mysql DNS管理平台
  3. .NET Core 2.0 特性介绍和使用指南
  4. hdu 4738 Caocao's Bridges 求无向图的桥【Tarjan】
  5. 团结就是力量,TeamCola浅谈创业团队腾云驾雾的归国征程
  6. Python函数定义变量报错:local variable ‘a‘ referenced before assignment
  7. helm安装istio_第五章 用Helm部署Istio
  8. jq 目录树ajax,javascript
  9. Eclipse主题插件之DevStyle
  10. settings.xml
  11. 1t硬盘怎么分区最好_1TB的硬盘如何分区比较合理?
  12. [zt]再谈QQ自动登陆器:提供C#源码下载(下)
  13. bootstrap typeahead实现模糊查询功能
  14. Object类型转换为Integer:
  15. 命令行退出python方法
  16. 每日一句:day02——From Zero To Hero
  17. 重新连接网络后怎么设置计算机,路由器恢复出厂设置后怎么重新设置?
  18. 告别极寒,科学家突破将量子计算机运行最低温提了15倍
  19. 中国移动通信业务代码符号说明
  20. 一建比二建对比难在哪?难多少?

热门文章

  1. spring webflow getting start
  2. thinkphp5 判断数据是否存在_ThinkPHP 5.1 中间件中判断要访问的操作是否存在
  3. Asterisk使用数据库配置方法
  4. tcp长连接和保活时间
  5. 8个树莓派超级计算机_6 个可以尝试的树莓派教程
  6. greenfoot推箱子游戏_推箱子小游戏V2.0更新
  7. arcgis批量将栅格里的nodata转为0
  8. 神经网络与深度学习——TensorFlow2.0实战(笔记)(五)(Matplotlib绘图基础<散点图>python)
  9. 【转】什么是staging server
  10. angular是MVC模式还是MVVM架构模式