Как создать дерево с помощью веб-сервиса? - PullRequest
0 голосов
/ 20 августа 2010

Я хочу создать древовидную структуру с помощью веб-сервиса.Я использовал метод веб-сервиса «снизу вверх» для создания простой арифметической операции.Я не могу понять, как построить дерево с помощью веб-сервисов.Есть ли способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 25 августа 2010

Если вы реализуете свой веб-сервис в Groovy с помощью Axis2, вы можете создать построитель, который создает Axis2 низкоуровневый 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
        }
    }
}  

Любую произвольную 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
    }
}
0 голосов
/ 20 августа 2010

Используйте рекурсивное определение, например:

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

operand = '+' | '-'

node = number

Затем вы можете просто кодировать его, используя 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>

В службе вы можете ходить по дереву или строить дерево. Я не уверен, что вы считаете эту услугу потребителем или производителем.

...