博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DocumentBuilder setEntityResolver() Method
阅读量:6073 次
发布时间:2019-06-20

本文共 5547 字,大约阅读时间需要 18 分钟。

Description

The Javax.xml.parsers.DocumentBuilder.setEntityResolver(EntityResolver er) method specifies the EntityResolver to be used to resolve entities present in the XML document to be parsed. Setting this to null will result in the underlying implementation using it's own default implementation and behavior.

Declaration

Following is the declaration for Javax.xml.parsers.DocumentBuilder.setEntityResolver() method

public abstract void setEntityResolver(EntityResolver er)

Parameters

  • er -- The EntityResolver to be used to resolve entities present in the XML document to be parsed.

Return Value

This method does not return a value.

Exception

  • NA

Example

For our examples to work, a xml file named Student.xml is needed in our CLASSPATH. The contents of this XML are the following:

12
Malik

The following example shows the usage of Javax.xml.parsers.DocumentBuilder.setEntityResolver()method.

 

package com.tutorialspoint;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;import org.xml.sax.EntityResolver;import org.xml.sax.InputSource;// an EntityResolver for our builder.class Resolver implements EntityResolver {   public InputSource resolveEntity(String publicId, String systemId) {       System.out.println(publicId);       System.out.println(systemId);      if (systemId.equals("")) {         System.out.println("Resolving Entity...");         return null;      } else {         // use the default behaviour         return null;      }   }}public class DocumentBuilderDemo {   public static void main(String[] args) {      // create a new DocumentBuilderFactory      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();      try {         // use the factory to create a documentbuilder         DocumentBuilder builder = factory.newDocumentBuilder();         Resolver res = new Resolver();         builder.setEntityResolver(res);         // create a new document from input stream and an empty systemId         Document doc = builder.parse("Student.xml");         // get the first element         Element element = doc.getDocumentElement();         // get all child nodes         NodeList nodes = element.getChildNodes();         // print the text content of each child         for (int i = 0; i < nodes.getLength(); i++) {            System.out.println("" + nodes.item(i).getTextContent());         }      } catch (Exception ex) {         ex.printStackTrace();      }   }}

 

 

为什么要设置EntityResolver呢?在解析的时候如果xml文件不符合xsd文件的要求则会报错误,从而终止解析,其实跟下面的一样效果的

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();factory.setValidating(false);factory.setNamespaceAware(true);SchemaFactory schemaFactory =     SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");factory.setSchema(schemaFactory.newSchema(    new Source[] {
new StreamSource("contacts.xsd")}));DocumentBuilder builder = factory.newDocumentBuilder();builder.setErrorHandler(new SimpleErrorHandler());Document document = builder.parse(new InputSource("document.xml"));

 

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();factory.setValidating(true);factory.setNamespaceAware(true);DocumentBuilder builder = factory.newDocumentBuilder();builder.setErrorHandler(new SimpleErrorHandler());Document document = builder.parse(new InputSource("document.xml"));

现在问题来了,如果要使用外部的dtd文件校验的话怎么办?

 

 

 

问题提出 :

解析ejb-jar.xml,出现在网络连不上的情况下,解析失败的情况。

问题分析:

我们使用的是DOM进行XML的解析的:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();            DocumentBuilder builder = factory.newDocumentBuilder();            //位置点            Document doc = builder.parse(file);

由于ejb-jar.xml中,有

 

在解析的时候,会从网络http://java.sun.com/dtd/ejb-jar_2_0.dtd中抓紧DTD文件,进行验证,如果网络不通,那么就会出现解析失败。

首先,DocumentBuilderFactory.newInstance()创建DocumentBuilderFactory实现类的对象,它会通过一下方式来查找实现类:

1.在系统环境变量中(System.getProperties())中查找 key=javax.xml.parsers.DocumentBuilderFactory

2.如果1没有找到,则找java.home\lib\jaxp.properties 文件,如果文件存在,在文件中查找key=javax.xml.parsers.DocumentBuilderFactory
3.如果2没有找到,则在classpath中的所有的jar包中查找META-INF/services /javax.xml.parsers.DocumentBuilderFactory 文件
    全都没找到,则返回null

如果上面都没有找到,那么就使用JDK自带的实现类:

com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

在创建DocumentBuilder实例的时候,是根据DocumentBuilderFactoryImpl的不同有不同的实现。

为了在网络不可用的情况下,正常解析XML文件,我们可以在使用builder之前,设置EntityResolver:

builder.setEntityResolver(                new EntityResolver(){                   public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException                   {                       return new InputSource(new StringBufferInputStream(""));   //                       return null;//这个的效果仍然是从网络来抓取DTD来验证                       }                }            );

上面的设置就不会对XML文件进行验证。

如果一定要验证的话,我们也可以设置使用本地的DTD文件来做验证:

builder.setEntityResolver(                new EntityResolver(){                   public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException                   {                      if(publicId.equals("-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"))                       {                          String dtd_uri = "C:/TEMP/ejb-jar_2_0.dtd";                           return new InputSource(dtd_uri);                       }                }            );

注意:直接return null,仍然会从网络来抓取DTD来验证。

 

 

所以这也是spring为什么采用设置setEntityResolver来校验xml格式的方式的原因

转载于:https://www.cnblogs.com/ghgyj/p/4027796.html

你可能感兴趣的文章
PHP 解析Maildir 邮件格式(eml文件)
查看>>
提升iOS审核通过率之“IPv6兼容测试”
查看>>
thinkphp配置文件数据库段配置
查看>>
专访孙睿 :能做自己,去做自己想做的,是件挺幸福的事儿
查看>>
开发者前期是如何学代码的(心得)
查看>>
Linux笔记(usermod命令,用户密码管理,mkpasswd)
查看>>
软件开发--深入浅出处理器
查看>>
文件查找命令
查看>>
文件权限管理
查看>>
链表节点的删除(无重复)
查看>>
eyoucms compare比较标签
查看>>
MPLS ×××概述
查看>>
jQuery+PHP+Mysql在线拍照和在线浏览照片
查看>>
nginx热部署升级
查看>>
使用JRockit 能否加速Myeclipse
查看>>
职场老司机才知道的Excel技巧,一般人不知道哦!
查看>>
Spring3与hibernate4注解式声明事务管理
查看>>
【linux下c语言服务器开发系列1】多进程处理多客户端的连接
查看>>
线性表的顺序存储结构
查看>>
初识centos7与centos6的区别
查看>>