`
smartzxy
  • 浏览: 200442 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

AXIOM入门(二)

    博客分类:
  • java
阅读更多

Working with OM Namespaces
由于对命名空间的处理也是解析XML的关键部分,因此AXIOM也提供了一系列API来处理命名空间:
public OMNamespace declareNamespace(String uri, String prefix);
public OMNamespace declareNamespace(OMNamespace namespace);
public OMNamespace findNamespace(String uri, String prefix) throws OMException;
以上方法对于使用其它解析方法处理过XML的朋友来说应该不难理解,但需要注意的是,一个已经添加过一次的命名空间声明不能被再次添加。
findNamespace方法是一个非常便捷的方法用来在整个对象树中找到一个命名空间对象。
在序列化过程中,一个由工厂方法直接创建的命名空间不会被立即声明,只有当序列化到这个命名空间被使用的地方(即遇到它的前缀)时才会被声明。
如果我们序列化我们创建的元素,我们会得到:

<ns:book xmlns:ns="axis2">
<ns:name></ns:name>
<ns:isbn></ns:isbn>
</ns:book>
 


Working with Attributes
下面让我们来看一下如何给book元素(代码中的root)添加一个属性:

OMAttribute type = factory.createOMAttribute("type",null,                                        "web-services");
root.addAttribute(type);
 


这时我们再序列化一下代码,我们将得到:

<ns:book xmlns:ns="axis2" type="web-services">
<ns:name></ns:name>
<ns:isbn></ns:isbn>
</ns:book>
 


Traversing the AXIOM Tree
在前面的章节,我们已经学习了如何创建一个元素,如何添加子节点,如何创建命名空间和属性。现在,就让我们来遍历一下整个AXIOM树。
遍历对象结构可以通过常用的获取子节点列表的方法,但在AXIOM里,获取子节点得到的是一个iterator。下面的代码演示来如何通过给定的节点来访问子节点。子节点的类型为OMNode,可以是OMText或OMElement中的任意一种。

Iterator children = root.getChildren();
while(children.hasNext()){
OMNode node = (OMNode)children.next();
}
 


需要补充的是,每一个OMNode都和相邻兄弟节点相连,所以在访问相邻节点时可以使用nextSibling() 或是 PreviousSibling()方法。还可以通过直接指定字节点的名称来获取子节点,方法getChildWithName (Qname)实现来这个功能,它会返回一个iterator.使用这些iterator的优点是,整个对象结构不会立马构造,只有当需要的时候才会构造。
Serialization
到目前为止,我们对创建和遍历AXIOM树已经有了一定的了解。现在就让我们将AXIOM树序列化或是写入一个输出流。
AXIOM可以被序列化成一个纯对象模型或是一个拉事件流。序列化过程使用一个XMLStreamWriter对象来写输出,因此相同的序列化机制也可以来写不同类型的输出,比如text,binary……
AXIOM提供了个一缓存标志来控制内存中的AXIOM。OMNode提供了两个方法serializeAndConsume和serialize。当serializeAndConsume方法被调用时,缓存标志被重置,序列化器不会缓存这个流,因此如果缓存标志不被设置,这个对象模型就不会被创建。在这种情况下,XML流不会创建对象模型,而直接被序列化到输出流里。所以如果调用了serializeAndConsume方法,我们就只能序列化一次AXIOM树,因为内存中并没有生成AXIOM对象树。但是,我们可以多次调用serialize方法。文字可能不好理解,下面让我看段代码:

String xmlStream = "<ns:book xmlns:ns=\"axis2\" type=\"web-services\
"><ns:name></ns:name><ns:isbn></ns:isbn></ns:book>";
//从字符串创建一个输入流
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream
                                               (xmlStream.getBytes());
//创建一个builder.
StAXBuilder builder = new StAXOMBuilder(byteArrayInputStream);
//获取root元素.
OMElement root = builder.getDocumentElement();
//在这里,我们调用两次serialize
root.serialize(System.out);
root.serialize(System.out);
 


如果我们执行上面的代码,我们会在控制台看到:

<ns:book xmlns:ns="axis2" type="web-services"><ns:name></ns:name><ns:
isbn></ns:isbn></ns:book>
<ns:book xmlns:ns="axis2" type="web-services"><ns:name></ns:name><ns:
isbn></ns:isbn></ns:book>
 


但是如果我们先调用serializeAndConsume()方法,再调用serialize()方法,就会出现一个异常。这是因为一旦serializeAndConsume()被调用,缓存标志就会被重置。所以紧接着调用serialize()方法时,我们没有东西可以被序列化来,因此就得到了一个异常。
//将上面的代码最后两行做如下改动,便会出现异常。

root.serializeAndConsume(System.out);
root.serialize(System.out);
 


AXIOM and SOAP
前面已经说过,AXIOM本来是作为Axis2的一部分——它的专属XML解析器而出现的,而Axis2是一个SOAP框架,那解析SOAP消息自然也是AXIOM的主要功能之一了。SOAP也是XML,只不过有它独特的结构而已,所以我们可以很方便的从AXIOM获取一个SOAP层的API。
下面我们直接看代码,用AXIOM分别创建一个SOAP1.1和SOAP1.2文档。
Creating a SOAP 1.1 Document:

OMFactory factory = OMAbstractFactory.getOMFactory();
   OMNamespace axis2 = factory.createOMNamespace("axis2", "ns");
   OMElement root = factory.createOMElement("book", axis2);
   OMAttribute type = factory.createOMAttribute("type",null,
                                                         "web-services");
   root.addAttribute(type);
   OMElement name = factory.createOMElement("name", axis2);
   OMElement isbn = factory.createOMElement("isbn", axis2);
   root.addChild(name);
   root.addChild(isbn);
   SOAPFactory soapFactory = OMAbstractFactory.getSOAP11Factory();
   //get the default envelope
   SOAPEnvelope env = soapFactory.getDefaultEnvelope();
   //add the created child
   env.getBody().addChild(root);
   System.out.println( env);
 

Creating a SOAP 1.2 Document:

OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace axis2 = factory.createOMNamespace("axis2", "ns");
OMElement root = factory.createOMElement("book", axis2);
OMAttribute type = factory.createOMAttribute("type",null,"web-
services");
root.addAttribute(type);
OMElement name = factory.createOMElement("name", axis2);
OMElement isbn = factory.createOMElement("isbn", axis2);
root.addChild(name);
root.addChild(isbn);
SOAPFactory soapFactory = OMAbstractFactory.getSOAP12Factory();
//get the default envelope
SOAPEnvelope env = soapFactory.getDefaultEnvelope();
//add the created child
env.getBody().addChild(root);
System.out.println( env);
 


两段代码唯一的区别是,使用的工厂不同而已。
Summary
通过以上的介绍,相信大家对AXIOM应该有了一个比较清晰的了解了,这样上手Axis2应该更容易了。
本AXIOM的入门连载是我学习了《Quickstart Apache Axis2》中的AXIOM一章后的一个整体理解,大部分内容为我在理解基础上的翻译。大家欲看原版文章可从附件下载。对AXIOM的理解有不对之处望直接指出,有批评才有提高嘛。

2
0
分享到:
评论

相关推荐

    axiom:Web应用程序的微型框架

    入门 构建Axiom的目的是使创建Web应用程序变得快速而轻松。 一个最小的应用程序将如下所示: - module ( my_app ). - export ([ start / 0 , handle / 3 ]). start () -&gt; axiom : start ( ? MODULE ). handle (&lt...

    react-axiom:React Axiom是在React中使用模型的方式

    入门 安装React Axiom: npm install --save react-axiom 要为应用程序构建模型类,请导入并扩展React Axiom Model类: import { Model } from 'react-axiom' ; class Task extends Model { } ; const task1 = ...

    axiom-react:Axiom-Brandwatch设计系统和React模式库

    Brandwatch设计系统和React模式库入门消费Axiom-React的最佳方法是使用npm软件包。 首先安装所需的Axiom的哪一部分-有关每个软件包中包含的内容的更多信息,请参阅“。添加按钮组件npm i @brandwatch/axiom-...

    axiom:公理-雨果主题。 GitTip

    公理-雨果主题Axiom旨在使您的内容读者和搜索...入门要了解更多信息,请参见下面的“快速入门”,“文档”和“实时示例”资源: 公理资源:公理存储库:执照知识共享署名-相同方式共享4.0国际许可证: 。 版权所有2020

    Webservice入门到精通

    ADB (Axiom Data Binding) 是Axis2默认的数据绑定机制,它利用了StAX(Streaming API for XML)技术来提高性能。 ##### 创建客户端的步骤 - **获取WSDL文件**:从Web服务提供者处获取WSDL文件。 - **使用wsdl2java...

    AXIS2 入门文档

    ### AXIS2 入门文档知识点概述 #### 一、AXIS2 概述 - **定义**:AXIS2作为Apache Axis的后继版本,旨在提供一个更为灵活、高效且易于扩展的SOAP引擎。 - **架构特点**: - 基于全新的体系结构设计,与之前的Axis1...

    Axis2从入门到精通--Webservice在eclipse下开发教程

    【Axis2从入门到精通——Webservice在Eclipse下开发教程】 Axis2是Apache软件基金会开发的一款先进的Web服务引擎,它是Axis1.x的全新设计版本,旨在提供更高效、更灵活的Web服务开发体验。本教程将逐步指导你如何...

    axis2入门实例

    此外,还可能涉及到XML数据绑定(如Axiom)和HTTP传输层的配置。 最后,调试和测试是关键步骤,确保服务正确部署并能正常响应客户端请求。你可能需要使用日志记录和错误处理来跟踪问题,同时理解Axis2的错误消息...

    axis2 webservice入门手册(JS,Java,PHP调用实例源码)www.sietoo.com出品

    ### Axis2 WebService 入门手册知识点详解 #### 一、Axis2简介 **1. AXIOM (AXIs Object Model)** - **定义**:AXIOM 是 Axis2 中用于处理 XML 的核心模型。它不同于传统的 DOM 和 SAX 解析方式,提供了更高效、...

    sudra-routes:Axiom Verge Speedrunning社区网站

    Sudra Routes / Axiom Verge社区网站 入门 确保您已安装git和docker。 将您自己添加到docker组中,因此您不必以root用户身份运行。 通常,该命令看起来像sudo usermod -a -G docker $USER ,但这取决于您的分发。 ...

    数学软件Mathematica- 使用入门

    ### 数学软件Mathematica—使用入门 #### 一、符号计算系统简介 Mathematica作为一款强大的数学软件,其核心特色之一就是符号计算能力。符号计算系统利用计算机的高速处理能力来帮助用户进行复杂的公式推导和计算...

    magnet 教程

    - **入门指南**:为用户提供Magnet的基本概念介绍。 - **在线帮助文档**:包含更详细的建模过程和概念解释,可在软件包内或官方网站的文档中心获取。 通过这些教程的学习,用户不仅可以掌握Magnet软件的基本使用...

    Axiom-Full-Stack-Developer-Batch-1-Module-A:这是模块A所有代码的代码存储库

    模块A通常会作为入门阶段,旨在为学员建立坚实的编程基础和全栈开发思维。 首先,让我们深入了解全栈开发的基本概念。全栈开发包括前端开发和后端开发两个主要部分。前端开发关注用户与应用的交互,涉及到HTML、CSS...

    talend手册

    本软件基于多种开源库和框架构建,如Apache Axiom、Apache Axis2、Apache Commons Lang等,确保了软件的稳定性和可靠性。 总结而言,Talend Open Studio for Data Integration手册为初学者提供了从安装到数据流转...

    axis2-1.7.7-bin.zip下载

    Axis2是Apache SOAP(Simple Object Access Protocol)项目的第二代产品,提供了高性能、灵活且可扩展的框架,支持多种协议,包括SOAP、RESTful、XML-RPC和WS-*规范。 在“axis2-1.7.7-bin.zip”压缩包中,你将找到...

    axis2 高端教程

    二、Axis2快速入门 1. 安装与配置:Axis2的安装通常涉及下载发行版,解压后配置环境变量,然后通过命令行工具启动服务器。 2. 创建服务:开发者可以使用Java代码直接创建服务,或者通过WSDL文件生成服务骨架,然后...

    Axis2精简版jar包

    精简版jar包简化了部署流程,降低了入门门槛,让开发者更专注于业务逻辑的实现。 总的来说,**Axis2精简版jar包**是一个针对Web服务开发的高效工具,它以轻量级的形式提供了一套完整的框架,包括服务组件、传输协议...

    axis1和2 使用文档

    2. **快速入门**:通过简单的示例展示如何创建和部署一个基本的Web服务,以及如何调用这个服务。 3. **高级特性**:介绍如何利用WS-*标准进行安全性设置、事务管理、可靠消息传递等。 4. **代码生成**:说明如何...

Global site tag (gtag.js) - Google Analytics