我想使用Web服务创建树结构。 我使用自下而上的Web服务技术来创建简单的算术运算。 我无法理解,如何使用Web服务构建树。 有没有办法实现这个目标?
答案 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
}
}