栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021SC@SDUSC【软件工程应用与实践】Cocoon项目5-分析core文件夹(四)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021SC@SDUSC【软件工程应用与实践】Cocoon项目5-分析core文件夹(四)

2021SC@SDUSC

这次和下一次博客我都将会对xml文件夹里的java文件进行分析。

分析core文件夹(四)
    • DOMFactory.java
      • 1.总结:
      • 2.方法:
      • 3.其他说明:
        • 一些关于接口和类的思考
        • DOCTYPE
    • AbstractDOMFragment.java
      • 1.总结:
      • 2.方法:
      • 3.其他说明:
        • DOM:
        • SAX:
        • JAXP:
    • documentHandlerAdapter.java
      • 1.总结:
      • 2.属性:
      • 3.方法:
    • documentHandlerWrapper.java
      • 1.总结:
      • 2.属性:
      • 3.方法:
    • LoggingContentHandler.java
      • 1.总结:
      • 2.声明变量:
      • 3.方法:
      • 4.其他说明:
        • 构造函数:
    • LoggingEntityResolver.java
      • 1.总结:
      • 2.属性:
      • 3.方法:

DOMFactory.java 1.总结:

这个文件是一个java接口,该接口标识了用于生成DOM document对象实例的类。

2.方法:
//创建一个新的document对象。
document newdocument();
//用指定的DOCTYPE创建一个新的document对象。
document newdocument(String name);
//使用指定的DOCTYPE、公共ID和系统ID创建一个新的document对象。
document newdocument(String name, String publicId, String systemId);
3.其他说明: 一些关于接口和类的思考

接口,在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

接口与类的区别:

  • 接口不能用于实例化对象。
  • 接口没有构造方法。
  • 接口中所有的方法必须是抽象方法。
  • 接口不能包含成员变量,除了 static 和 final 变量。
  • 接口不是被类继承了,而是要被类实现。
  • 接口支持多继承。
DOCTYPE

一个文档类型标记是一种标准通用标记语言的文档类型声明,它的目的是要告诉标准通用标记语言解析器,它应该使用什么样的文档类型定义(DTD)来解析文档。

AbstractDOMFragment.java 1.总结:

这个类更容易表示为DOM的对象的XMLFragment抽象实现

实现了XMLFragment接口

2.方法:

这个java类只有一个方法,这个方法通过序列化toDOM()的结果生成表示对象状态的SAX事件。

首先使用JAXP创建文档document,然后创建一个documentFragment来保存toDOM()的结果,最后构建表示这个对象的DOM文件

public void toSAX(ContentHandler handler) throws SAXException {

    documentBuilder builder;
    try {
        builder = documentBuilderFactory.newInstance().newdocumentBuilder();
    } catch (ParserConfigurationException e) {
        throw new SAXException("Couldn't get a documentBuilder", e);
    }

    document doc = builder.newdocument();

    Node df = doc.createdocumentFragment();

    try {
        toDOM(df);
    } catch(Exception e) {
        throw new SAXException("Exception while converting object to DOM", e);
    }

    handler.startdocument();
    new DOMStreamer(handler).stream(df);
    handler.enddocument();
}

在这个类中,只是定义了方法的名字、返回值和参数,并没有对方法进行具体的实现。有一些在官网中显示弃用的方法,如addcookie等不在赘述。

3.其他说明: DOM:

DOM一种与平台和语言无关的应用程序接口(API),它可以动态地访问程序和脚本,更新其内容、结构和www文档的风格(HTML和XML文档是通过说明部分定义的)。文档可以进一步被处理,处理的结果可以加入到当前的页面。DOM是一种基于树的API文档,它要求在处理过程中整个文档都表示在存储器中。

SAX:

SAX是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。

JAXP:

JAXP是Java XML程序设计的应用程序接口之一,它提供解析和验证XML文档的能力。

JAXP解析XML的三种基本接口为:

  • 文档对象模型解析接口或DOM接口
  • XML简单API解析接口或SAX接口
  • XML流API或StAX接口

除了解析接口,JAXP还提供了XSLT接口用来对XML文档进行数据和结构的转换。

documentHandlerAdapter.java 1.总结:

这个类是一个实用程序类,它将SAX 1.0版本的documentandler“改编”为SAX 2版本的ContentHandler。这个类完全支持XML命名空间,转换xmlns和xmlns。

继承自AbstractSession。

实现了documentHandler接口

2.属性:
//面向元素的名称空间uri堆叠映射表。
private Hashtable stackedNS=new Hashtable();
//当前名称空间表。
private NamespacesTable namespaces=new NamespacesTable();
//当前堆栈深度
private int stack=0;
3.方法:
  • public void setdocumentLocator (Locator locator)
    • 接收一个用于定位SAX文档事件起源的对象。
  • public void startdocument ()
    • 接收文档开始的通知。
  • public void enddocument ()
    • 接收文档结束的通知。
  • public void startElement (String name, AttributeList a)
    • 接收元素开始的通知。
    • 检查名称空间声明,进行了两次循环,因为我们不确定属性的顺序。
    • 解析元素命名空间中的名称,第二个循环遍历属性以填充AttributesImpl
    • 最后通知contentHandler,stack++。
  • public void endElement (String name)
    • 接收元素结束的通知。
    • 如果内容处理器为空, 则抛出内容处理器未建立的异常,stack–。
    • 通知contentHandler,取消命名空间。
  • public void characters (char ch[], int start, int len)
    • 接收字符数据通知。
  • public void ignorableWhitespace (char ch[], int start, int len)
    • 接收元素内容中可忽略空格的通知
  • public void processingInstruction (String target, String data)
    • 接收处理指令的通知。

除了第一个方法,后面其他方法都有一个共同的异常:

if (super.contentHandler==null)
    throw new SAXException("ContentHandler not set");
documentHandlerWrapper.java 1.总结:

这个类是一个实用程序类,它“包装”了SAX 1.0版本的documentandler,并将通过它的XMLConsumers接口接收到的事件转发给它。

继承自AbstractXMLConsumer类。

2.属性:
//当前名称空间表
private NamespacesTable namespaces = new NamespacesTable();
//要包含在下一个元素中的名称空间声明的向量。
private Vector undecl = new Vector();
//当前的documentHandler
protected documentHandler documentHandler;
3.方法:
  • public void recycle()
    • 回收方法的实现
  • public void setdocumentHandler(documentHandler document)
    • 设置将接收XML数据的 documentandler 。
  • public void setdocumentLocator (Locator locator)
    • 接收一个用于定位SAX文档事件起源的对象。
  • public void startdocument ()
    • 接收文档开始的通知。
  • public void enddocument ()
    • 接收文档结束的通知。
  • public void startPrefixMapping(String prefix, String uri)
    • 开始前缀和uri命名空间映射的范围。
  • public void endPrefixMapping(String prefix)
    • 结束前缀和uri映射的范围。
  • public void startElement(String uri, String loc, String raw, Attributes a)
    • 接收元素开始的通知。
    • 创建属性列表,设置xmlns:…="…"属性,然后设置真实属性,最后调用文档处理程序startElement()方法
  • public void endElement(String uri, String loc, String raw)
    • 接收元素结束的通知。
  • public void characters(char ch[], int start, int len)
    • 接收字符数据通知。
  • public void ignorableWhitespace(char ch[], int start, int len)
    • 接收元素内容中可忽略空格的通知。
  • public void processingInstruction(String target, String data)
    • 接收处理指令的通知。
LoggingContentHandler.java 1.总结:

这个类用于处理日志,日志内容处理程序记录所有通过日志记录器的事件。

继承自AbstractLogEnabled。

实现了ContentHandler接口

2.声明变量:
//来自这个处理程序的所有调试消息都以这个id作为前缀。
String id;
//当前的ContentHandler
ContentHandler contentHandler;
3.方法:
private void log(String location, String description) {
    getLogger().debug(id + "[" + location + "] " + description + "n");
}

记录日志,包括id,位置和描述,私有方法,只能在该类中可见。

//记录setdocumentLocator
public void setdocumentLocator(Locator locator) 
//记录startdocument
public void startdocument()
//记录enddocument
public void enddocument()
//记录startPrefixMapping
public void startPrefixMapping(String prefix, String uri) 
//记录endPrefixMapping
public void endPrefixMapping(String prefix)     
//记录startElement,包括uri,local,raw等信息
public void startElement(String uri, String loc, String raw, Attributes a)
//记录startElement,包括uri,local,qname等信息
public void endElement(String uri, String loc, String qname) 
//记录characters
public void characters(char ch[], int start, int len)
//记录ignorableWhitespace
public void ignorableWhitespace(char ch[], int start, int len) 
//记录processingInstruction,包括target,data等
public void processingInstruction(String target, String data) 
//记录skippedEntity
4.其他说明: 构造函数:

使用指定的和目标的contentHandle创建新的LoggingContentHandler

public LoggingContentHandler(String id, ContentHandler contentHandler) {
    this.id = id;
    this.contentHandler = contentHandler;
}
LoggingEntityResolver.java 1.总结:

这个类是日志实体解析器,用以帮助进行缓存。

继承自AbstractLogEnabled。

实现了EntityResolver接口

2.属性:
//一个实体处理对象
protected EntityResolver resolver;
//一个依赖关系的集合
protected Set dependencies;
3.方法:
  • public InputSource resolveEntity(String public_id, String system_id)
    • 用实体处理对象确定输入源,写入日志,返回输入源
  • public Set getDependencies()
    • 返回为dependencies的一个不可修改的集合
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/346367.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号