
注意: 本文的内容并不涉及所有细节. 我希望读者可以在阅读的同时阅读源代码. 本文的内容仅供作者个人理解,以期达到抛砖引玉的效果. 我也希望得到大家的认可,并进行更多的交流.
在进行xml解析时,我首先想到的是Dom,SAX等. 当我第一次学习Java时,我也使用了这两种方法进行解析. 当我得到一个Xml时,第一个反应必须是“如果-else则写另一个”. 在学习Tomcat的过程中,我找到了一个Digester组件,该组件简单易行,可以解析xml.
Digester是Jakarta的Commons子项目下的模块,它支持对任意XML文档进行基于规则的处理. 它最初是Structs项目的一部分,后来由于用途广泛而被归于Commons.
Digester作为组件的核心类,我们首先看一下他的类:

从图片中可以看到,Digester继承了DefaultHandler并间接实现了四个接口: EntityResolver,ErrorHandler,DTDHandler和ContentHandler. 熟悉SAX的朋友应该了解这些接口的功能. 从中我们可以看到,摘要器基于SAX原理. 假设我们基于SAX设计Digester. 我们应该处理什么问题?

Xml格式的不断变化及其带来的分析方法的变化是首先要解决的问题.
1 Xml始终是用户的Xml,因此Digester提供了一套完整的规则链制定方法,这是用户通过Digester制定符合自己的Xml的规则链的唯一方法.
2解析方法的更改是由Xml格式的更改引起的,因此Digester使用Rule接口来封装与处理方法相对应的规则. 如果用户对当前提供的默认处理方法不满意,则可以自定义Rule界面.
以上两个问题的解决方案已经解决了主要问题. 现在让我们看一下如何处理Digester中的两个问题.
首先,Digester类提供了一系列规则链制定方法. 请注意,您需要在编写规则链之前调用push方法,以将xml文档的根元素推入堆栈.


每个规则链制定方法都会调用addRule,例如添加对象创建方法.

addRule方法将xml的正则表达式规则和当前对应的规则添加到rules变量. 规则的类型是接口类型,在Digester程序中使用实现类BasesRule. :

通过registerRule方法,将当前规则和路径放入RulesBase类中的HashMap缓存和ArrayList规则中. 其中,缓存记录规则和路径正则表达式之间存在一一对应关系,并且规则记录当前xml文件中涉及的所有规则. Rule接口在SAX中封装了经典的start,body和end方法.


制定规则后,您需要输入解析部分.

调用Digester.parse方法以开始解析工作. 在解析中调用configure方法. 乍一看,它是初始化配置信息,但是在进入initialize方法之后,发现该方法不执行任何操作. 通过查看注释以了解所有内容,此方法提供了延迟加载挂钩函数,而Digester并不意味着在注释中显示可伸缩性.

执行配置后解析xml解析xml,输入核心解析器代码段. 在getXMLReader方法中,首先获取XmlParser,然后获取XmlReader. 正如我之前提到的Digester基于SAX解析方法,很容易想到SAXParserImpl类. 在SAXParserImpl类的构造方法中,将xmlReader变量分配给JAXPSAXParser类,最后调用的parse方法是AbstractSAXParser类中的parse方法.


接下来,我们将进入我们熟悉的SAX模式来解析Xml. 我们对此更加熟悉. 每次我们开始解析为startElement,endElement时,endElement方法都包含调用每个规则的body方法和end方法.


我个人认为我正在使用策略模式,然后在特定的匹配规则类中调用实现方法. 这种实现方法的一个好处是,如果开发人员认为Digester中提供的方法和规则实现类不足以满足其个人需求,则可以自定义Rule接口实现类以完成所需的功能.
由于篇幅所限,将对Digester的一部分进行分析,并且在学习时需要注意一些细节. 例如,Digester在每个调用层和设计模式之间包含许多检查. 这也值得您仔细研究. 建议您订阅公共邮件列表并与开发人员进行更多交流.
如果文本中有任何遗漏,欢迎您批评和纠正,欢迎射击.
电子邮件: zqxjqka#gmail.com
QQ: 982080920
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-214813-1.html
应该说爱卿所言甚是
否则后患无穷
淘宝卖20你还买
没有人靠炒股发财