开发那点事系列三 - 由XML解析引起的API设计思考

简介:       谈起XML解析,大家可能第一反应是DOM,SAX模型。没错,在Java领域,无论是Dom4j, Jdom,还是XOM,其底层都会依赖具体的解析器引擎(Crimson or Xerces)去做事,具体的实现后面会有文章陆续探究。今天写这篇文章的主要目的是想和大家分享自己使用Java SE6的StAX API的一些感受,尤其是对其API的设计理念的一个思考,没多少文字,主要是一

      谈起XML解析,大家可能第一反应是DOMSAX模型。没错,在Java领域,无论是Dom4j, Jdom,还是XOM,其底层都会依赖具体的解析器引擎(Crimson or Xerces)去做事,具体的实现后面会有文章陆续探究。今天写这篇文章的主要目的是想和大家分享自己使用Java SE6StAX API的一些感受,尤其是对其API设计理念的一个思考,没多少文字,主要是一些启发性的东东。当然,在你继续浏览之前,希望能熟练掌握以下类库,有助于更好的和我产生共鸣,哈哈:

     

SAX StAX DOM XSLT
javax.xml.parsers javax.xml.stream javax.xml.parsers javax.xml.transform

javax.xml.stream.events
javax.xml.transform.dom

javax.xml.stream.util
javax.xml.transform.sax



javax.xml.transform.stax



javax.xml.transform.stream

      技术使用论&技术创造论无论你秉持哪种观点,原理性的、设计性的思维多培养培养,总归没有错的。在对Sun的JAX-× API深度理解的基础上,希望能抛砖引玉,引发XML API设计上的思考。言归正传吧,当我们读过一些资料(尤其是我后面列出的文献资料)过后,我们都会了解到StaxSAX的不同之处:基于流的两种不同模型的实现PushPull。那么什么是pull,什么又是push,到底哪种好?一句话概括一下(示例代码如下):Push模型要靠回调或者观察者模式运作,而Pull模型靠的是迭代器,外加Visitor模式的Filter机制(一种不错的事件处理链模式)。

      SAX(Application code registers a callback, which the SAX parser invokes as it reads the XML:)

FileInputStream fis = new FileInputStream(file);

XMLReader saxXmlReader = XMLReaderFactory.createXMLReader();

// Create callback handler
DefaultHandler handler = new DefaultHandler() {
public void startElement(String uri, String localName, String qName, Attributes attributes) {
        // do something with element
      }
};


// register hander
saxXmlReader.setContentHandler(handler);
saxXmlReader.setErrorHandler(handler);

// control passed to parser...
saxXmlReader.parse(new InputSource(fis));

      StAX(Application code controls parsing directly by iterating over the document using the StAX stream reader)

FileInputStream fis = new FileInputStream(file);

XMLInputFactory factory = (XMLInputFactory)XMLInputFactory.newInstance();
XMLStreamReader staxXmlReader = (XMLStreamReader) factory.createXMLStreamReader(fis);

for (int event = staxXmlReader.next(); event !=   XMLStreamConstants.END_DOCUMENT;
 event = staxXmlReader.next()) {

  
switch (event) {
  case XMLStreamConstants.START_DOCUMENT:
    // do something with element, such as :System.out.println("Start document " + staxXmlReader.getLocalName());
    break;
  case XMLStreamConstants.START_ELEMENT:
    // do something with element, such as :System.out.println("Start element " + staxXmlReader.getLocalName());
    // do something with element, such as :System.out.println("Element text " + staxXmlReader.getElementText());
    break;
  case XMLStreamConstants.END_ELEMENT:
    // do something with element
    break;
  default: 
    // do something with element
    break;
 }}

      看似朴实的设计思路,却衍生出很多思考。Spring中充满了钩子回调函数(类似preXXXHandler/ProcessorpostXXXHandler/Processor),为什么不做成Listener APIHtmlParser中也充满了Visitor模式,比起Handler机制,灵活在哪?为什么说StAX既保证了运行时效率,又把持了元素的上下文状态。。。诸如此类的问题,在设计我们自己的框架API时,无不需要慎重考虑~

参考文献:

 
目录
相关文章
|
17天前
|
XML JavaScript 前端开发
xml文件使用及解析
xml文件使用及解析
|
2天前
|
人工智能 机器人 API
【Python+微信】【企业微信开发入坑指北】3. 如何利用企业微信API给微信群推送消息
【Python+微信】【企业微信开发入坑指北】3. 如何利用企业微信API给微信群推送消息
5 0
|
2天前
|
缓存 人工智能 API
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
6 0
|
3天前
|
XML Java 数据库连接
Javaweb之Mybatis的XML配置文件的详细解析
Javaweb之Mybatis的XML配置文件的详细解析
13 0
|
6天前
|
XML C# 数据格式
C# 解析XML文件
C# 解析XML文件
15 1
|
8天前
|
机器学习/深度学习 API TensorFlow
TensorFlow的高级API:tf.keras深度解析
【4月更文挑战第17天】本文深入解析了TensorFlow的高级API `tf.keras`,包括顺序模型和函数式API的模型构建,以及模型编译、训练、评估和预测的步骤。`tf.keras`结合了Keras的易用性和TensorFlow的性能,支持回调函数、模型保存与加载等高级特性,助力提升深度学习开发效率。
|
13天前
|
小程序 前端开发 API
小程序全栈开发中的RESTful API设计
【4月更文挑战第12天】本文探讨了小程序全栈开发中的RESTful API设计,旨在帮助开发者理解和掌握相关技术。RESTful API基于REST架构风格,利用HTTP协议进行数据交互,遵循URI、客户端-服务器架构、无状态通信、标准HTTP方法和资源表述等原则。在小程序开发中,通过资源建模、设计API接口、定义资源表述及实现接口,实现前后端高效分离,提升开发效率和代码质量。小程序前端利用微信API与后端交互,确保数据流通。掌握这些实践将优化小程序全栈开发。
|
16天前
|
JavaScript API UED
Vue3.0新特性解析与实战:Composition API、Teleport与Suspense
【4月更文挑战第6天】Vue3.0引入了颠覆性的Composition API,通过函数式方法提升代码可读性和复用性,例如`setup()`、`ref`等,便于逻辑模块化。实战中,自定义的`useUser`函数可在多个组件中共享用户信息逻辑。另外,Teleport允许组件渲染到DOM特定位置,解决模态框等场景的上下文问题。再者,Suspense提供异步组件加载的延迟渲染,使用fallback内容改善用户体验。这些新特性显著优化了开发和性能,适应现代Web需求。
19 0
|
9天前
yolo-world 源码解析(六)(2)
yolo-world 源码解析(六)
18 0
|
9天前
yolo-world 源码解析(六)(1)
yolo-world 源码解析(六)
12 0

推荐镜像

更多