我目前正在使用Savon在Ruby中构建SOAP客户端,但是当我编写代码来生成XML时,我不得不写:
builder = Builder::XmlMarkup.new
builder.ns :request do
builder.ns :Foo do
builder.ns :FooBar do
builder.ns :Bar, "Foo"
end
end
end
生成
<ns:request>
<ns:Foo>
<ns:FooBar>
<ns:Bar>Foo</ns:Bar>
</ns:FooBar>
</ns:Foo>
</ns:request>
这显然是非常重复的,如果可能的话,我想减少NS的重复。我还注意到,如果没有ns,我可以使用大括号,而不是dos / ends。
这有什么办法吗?我不喜欢不能使用大括号,当我稍后添加元素名称的动态输入时,它可能会使事情变得复杂。
我试过
def send_builder(requestsym, data=nil)
@@builder requestsym, data
end
但是我对块/ procs / lambdas的了解并不足以使它与嵌套元素一起工作。
答案 0 :(得分:1)
我认为这就是你需要的,所以你想在你的xml请求中预先添加命名空间吗?:
使用Savon,您可以将命名空间添加到xml请求中,如下所示
client = Savon.client do
wsdl: "http://www.webserviceurl.net/service.asmx?WSDL"
namespace_identifier: :ns
end
response = client.call(:yourOperationHere, message: { request: { foo: { foo_bar: { bar: "Foo" } } } })
结果将是(您的请求正文):
<ns:request>
<ns:foo>
<ns:fooBar>
<ns:bar>
Foo
</ns:bar>
</ns:fooBar>
</ns:foo>
</ns:request>
正如您的注释,Savon有一个名为Gyoku的东西,它将符号转换为:camelcase,因此如果您的请求是caseSensitive,请使用字符串而不是符号。