如何使用Web服务创建树?

时间:2010-08-20 12:26:18

标签: web-services tomcat tree axis2

我想使用Web服务创建树结构。 我使用自下而上的Web服务技术来创建简单的算术运算。 我无法理解,如何使用Web服务构建树。 有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:0)

使用递归定义,如:

expr = expr1 operand expr2 | node
expr1 = expr
expr2 = expr

operand = '+' | '-'

node = number

然后你cqn使用JSON或XML直接编码它

15 + 3 - 2成为

{ "expr" : 
  { "expr1": { "expr1":"15" "operand":"+" "expr2":"3"} 
    "operand": "-"
    "expr2": "2"}}

或在xml中

<expr>
   <expr1>
      <expr1>15</expr1>
      <operand>+</operand>
      <expr2>3</expr2>
   </expr1>
   <operand>+</operand>
   <expr2>2</expr2>
</expr>

在服务中,您可以走树或构建树。我不确定您是将该服务视为消费者还是制作人。

答案 1 :(得分:0)

如果使用Axis2在Groovy中实现Web服务,则可以创建一个生成Axis2 low level Axiom API调用的构建器:

package example

import groovy.util.BuilderSupport  

import org.apache.axiom.om.OMAbstractFactory
import org.apache.axiom.om.OMElement
import org.apache.axiom.om.OMFactory
import org.apache.axiom.om.OMNamespace

class OMElementBuilder extends BuilderSupport {  

    OMElement result
    String namespace

    OMElementBuilder(namespace) {
        this.namespace = namespace
    }

    def createNode(name) {
        return createNode(name, null, null)
    }

    def createNode(name, value) {
        return createNode(name, null, value)
    }

    def createNode(name, Map attributes) {
        return createNode(name, attributes, null)
    }

    def createNode(name, Map attributes, value) {
        OMFactory   fact = OMAbstractFactory.getOMFactory()
        OMNamespace omNs = fact.createOMNamespace(namespace, "ns")
        OMElement   node = fact.createOMElement(name, omNs)

        if (value) {
            fact.createOMText(node, value)
        }

        return node
    }

    void setParent(parent, child) {
        parent.addChild(child)
    }

    void nodeCompleted(parent, node) {
        if (!parent) {
            result = node
        }
    }
}  

任何arbitray XML结构都可以轻松创建如下:

package example

import org.apache.axis2.AxisFault
import org.apache.axiom.om.OMElement
import javax.xml.namespace.QName

public class BankService {

    // withdraw operation
    public OMElement withdraw(OMElement requestElement) {

        // Build the response
        def builder = new OMElementBuilder("http://example")

        builder.withdrawResponse() {
            balance("1000")
            additionalInfo() {
                item() {
                    message("hello world")
                }
                item() {
                    message("hello world")
                }
                item() {
                    message("hello world")
                }
                item() {
                    message("hello world")
                }
            }
        }

        return builder.result
    }
}