首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

几种操作 Feed 的 API 的示例及其比较 -2 Abdera 以及 Abdera API

几种操作 Feed 的 API 的示例及其比较 -2 Abdera 以及 Abdera API

Abdera 以及 Abdera API是 Apache 的一个 incubation 的项目,旨在提供一个 IETF ATOM()功能完备的、性能优良的实现。现在 Abdera 已经发布了 0.4.0 版本。
Abdera 创建了自己的 Feed Object Model 也就是 FOM 作为 Feed 的内部数据结构,FOM 为 ATOM 定义了一系列 FOMObject,像 FOMFeed,FOMEntry,FOMLink 等等,提供了自己的 parser, writer, XPath 等一系列 API。要使用 Abdera API,程序需要包含的包有:
1
2
3
4
5
6
7
8
* Core API: abdera.core.0.3.0-incubating.jar (required)
* Parser Impl: abdera.parser.0.3.0-incubating.jar (required)
* IRI Support: abdera.i18n.0.3.0-incubating.jar (required)
* axiom-api-1.2.5.jar (required by core)
* axiom-impl-1.2.5.jar (required by core)
* geronimo-activation_1.0.2_spec-1.1.jar (any JAF impl is required)
* commons-logging-1.0.4.jar
* jaxen-1.1.1.jar (required by the core, XPath 实现 )




下面还是来看看 Abdera API 的使用情况。清单 2 是用 Abdera API 实现的 Feed Query。
清单 2. 用 Abdera API 实现 Feed Query
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package xml.Abdera;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.abdera.Abdera;
import org.apache.abdera.model.Document;
import org.apache.abdera.model.Entry;
import org.apache.abdera.model.Feed;
import org.apache.abdera.writer.Writer;
import org.apache.abdera.xpath.XPath;

public class AbderaFilterFeed implements main.IFilterFeed{
   
public OutputStream filter(InputStream is, String xpathExpr){
  OutputStream os = System.out;
  // new adbera instance
  Abdera abdera = Abdera.getNewFactory().getAbdera();
   
// parse input file stream into Adbera Document object
  Document<Feed> doc = abdera.getParser().parse(is);
   
//get Feed FOM object
  Feed feed = doc.getRoot();
   
//create xpath object
  XPath xpath = abdera.getXPath();
   
//specify the xpath expression
  //String expression = "atom:feed/atom:entry[ " + xpathExpr + "]";
  String expression =
      "atom:feed/atom:entry[atom:content/row:row/row:Customer_Name = 'Ford']";
   
//generate namespace map
  Map<String,String> namespaces = new HashMap<String,String>();
  namespaces.put("atom", "http://www.w3.org/2005/Atom");
  namespaces.put("row", "http://www.ibm.com/xmlns/atom/content/datarow/1.0");
  //select nodes using xpath object
  List entries = xpath.selectNodes(expression, feed.getDocument(), namespaces);
   
//generate output feed
  Feed output = abdera.newFeed();
  for( int i = 0; i < entries.size(); i++ ){
  Entry entry = (Entry) entries.get(i);
  output.addEntry(entry);
  }
  //get pretty xml writer and writer to output stream
  Writer writer = abdera.getWriterFactory().getWriter("prettyxml");
  try {
  writer.writeTo(output, os);
  } catch (IOException e) {
  e.printStackTrace();
  }
  return os;
  }
   
}




可以看出,用 Abdera API 实现的 Feed Query 基本需要这几步:
  • 程序首先需要获得 Abdera 实例,
  • 获得相应的 parser 用来解析输入的 xml 文档,
  • 接着还是用 Abdera 实例获得单例 XPath 对象,
  • 生成相应的 namespace Map,
  • 执行 XPath evaluation,
  • 序列化。
从以上的步骤看出,和清单 1 中的 DOM API 比起来,从步骤的多少来看基本没有差别,但是每一步 Abdera 都提供了友好的 API,使得程序不需要自己关注那许多底层的对象的创建。比如 namespace 的创建,DOM API 要求程序实现 NamespaceContext 接口,而 Abdera 只需要传入一个 namespace Map 就好了,也没有复杂的属性的设置。而且 Abdera 提供很好的 Serialization 的 API,程序可以根据自己的需要获得相应的 writer,本示例程序是需要在 console 输入程序允许结果,所以用了 prettyxml 的格式输出便于阅读。
返回列表