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.方法:
这个文件是一个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 变量。
- 接口不是被类继承了,而是要被类实现。
- 接口支持多继承。
一个文档类型标记是一种标准通用标记语言的文档类型声明,它的目的是要告诉标准通用标记语言解析器,它应该使用什么样的文档类型定义(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)
- 接收处理指令的通知。
这个类用于处理日志,日志内容处理程序记录所有通过日志记录器的事件。
继承自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) //记录skippedEntity4.其他说明: 构造函数:
使用指定的和目标的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的一个不可修改的集合



