wsdl2objc定制(一)namespace

1、问题抛出:

如今还是有非常多人使用 wsdl2objc 来调用webservice,可是有时候会有不开心的事情发生,

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>Unmarshalling Error: 意外的元素 (uri:"http://xxxxx.xxxxx.com/", local:"a")。所需元素为<{}a>,<{}b>,<{}c> </faultstring></soap:Fault></soap:Body></soap:Envelope>

意外的元素,这什么东西嘛!

那看看我们发出去了什么

 <soap:Body>
    <xxxxService:test>
      <xxxxService:a>1</xxxxService:a>
      <xxxxService:b>1.4</xxxxService:b>
      <xxxxService:c>xxx</xxxxService:c>
    </xxxxService:test>
  </soap:Body>

这里说明一下:xxxxService 是我的ServiceName,在这里应该叫命名空间,这命名空间就是意外的罪魁祸首,如今知道元凶,那我们要怎么处理呢?

2、解决的方法:

1、蠢办法。(以下还有聪明的办法哦!)找到自己要调用的webservice方法的相应的设置參数的方法。例如以下:

- (void)addElementsToNode:(xmlNodePtr)node
{

	if(self.a != 0) {
		xmlAddChild(node, [self.a xmlNodeForDoc:node->doc elementName:@"a" elementNSPrefix:@"xxxxService"]);
	}
	if(self.b != 0) {
		xmlAddChild(node, [self.b xmlNodeForDoc:node->doc elementName:@"b" elementNSPrefix:@"xxxxService"]);
	}
	if(self.c != 0) {
		xmlAddChild(node, [self.c xmlNodeForDoc:node->doc elementName:@"c" elementNSPrefix:@"xxxxService"]);
	}
}

把上面的xxxxService參数改为nil。改完后例如以下

- (void)addElementsToNode:(xmlNodePtr)node
{

	if(self.a != 0) {
		xmlAddChild(node, [self.a xmlNodeForDoc:node->doc elementName:@"a" elementNSPrefix:nil]);
	}
	if(self.b != 0) {
		xmlAddChild(node, [self.b xmlNodeForDoc:node->doc elementName:@"b" elementNSPrefix:nil]);
	}
	if(self.c != 0) {
		xmlAddChild(node, [self.c xmlNodeForDoc:node->doc elementName:@"c" elementNSPrefix:nil]);
	}
}

这方法为什么说是蠢呢?由于这webservice有非常多的方法,那不是要一个个改掉,当然聪明点的不回手动一个个去改,用文本替换的方式。所有替换掉,可是要是接口有变呢?又要替换一次,所以就有了更聪明的办法。

2、聪明的办法:闲话不多说,就是自己改wsdl2objc的源代码,自己定义一个自己的wsdl2objc。

一、弄源代码:打开 http://code.google.com/p/wsdl2objc/

点击Export to GitHub。再点击,再点击最以下的绿色button。这里默认大家都有github的帐号了。没有就去注冊一个吧!

获取源代码的方式不止这一种,还实用svn,个人比較喜欢github。

然后在你的github账户上就有了一份你自己的源码。

弄不来的就直接用我的就好了

https://github.com/babydance/wsdl2objc

选择Download Zip 下载来。源代码获取完毕。

二、用xcode打开项目文件。有可能xcode会提示你要不要把项目转成arc的,这个随便的啦

红框里的模板文件就是我们要改的地方

用搜索来找到我们要改的地方 搜索词:xmlNodeForDoc:node->doc elementName:

搜出了两个地方,我们仅仅要改第一个。

红框里面的就是我们要改的地方,没错。改成nil,

改完后就这样了,cmmand加R执行。

再又一次生成一下看看

- (void)addElementsToNode:(xmlNodePtr)node
{

	if(self.a != 0) {
		xmlAddChild(node, [self.a xmlNodeForDoc:node->doc elementName:@"a" elementNSPrefix:nil]);
	}
	if(self.b != 0) {
		xmlAddChild(node, [self.b xmlNodeForDoc:node->doc elementName:@"b" elementNSPrefix:nil]);
	}
	if(self.c != 0) {
		xmlAddChild(node, [self.c xmlNodeForDoc:node->doc elementName:@"c" elementNSPrefix:nil]);
	}
}

是不是生成的就是nil了,好了,最后

把app文件考出来。分给成家班用,duang~~~~,

时间: 2024-10-03 11:12:45

wsdl2objc定制(一)namespace的相关文章

wsdl2objc namespace 自定义

1.问题抛出: 现在还是有很多人使用 wsdl2objc 来掉用webservice,但是有时候会有不开心的事情发生, <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>Unmarshal

定制类自己的的new_handler

C++中的new操作符首先使用operator new函数来分配空间,然后再在此空间上调用类的构造函数构造对象.当operator new无法分配所需的内存空间时,默认的情况下会抛出一个bad_alloc异常,在抛出这个异常之前,如果用户指定了错误处理函数即new_handler,则程序会先执行new_handler函数进行错误处理.为了设置这个错误处理函数,我们需要调用set_new_handler函数,它在std命名空间内的情况如下所示 namespace std{ typedef void

Android定制控件-带图像的TextView

最近在学习Android,边看书边敲代码,看到是李宁的Android开发完全讲义,因为是对着书本敲的, 所以代码跟原书的代码基本上是一致的 看到第四章,定制控件,觉得需要记录下些东西,所有把代码写到博客作为自己以后查阅的资料. 先上效果图 在src新建net.blogjava.mobile.widget/IconTextView.java 代码如下: package net.blogjava.mobile.widget; import android.content.Context; impor

Django防Admin定制插件(一)

程序启动时查找所有注册了的apps.py 会执行def ready方法MyAdmin.apps.py: def ready(self): super(MyadminConfig,self).ready() from django.utils.module_loading import autodiscover_modules autodiscover_modules('reg') 这里应该是收集所有的reg文件.执行reg.py中的注册函数app01.reg.py: from app01 imp

C# 利用PrintDocument定制打印单据

本文是利用PrintDocument定制打印单据的小例子. 涉及知识点: PrintDocument :从 Windows 窗体应用程序打印时,定义一种可重用的可发送到打印机上的对象. PrintPreviewControl :表示 Windows 窗体应用程序打印预览的原始预览部分,没有任何对话框或按钮. Graphics :GDI+绘图对象 PageSettings:指定应用于单页打印的设置 DefaultPageSettings:PrintDocument的属性 PrintPage事件:P

定制Asp.NET 5 MVC内建身份验证机制 - 基于自建SQL Server用户/角色数据表的表单身份验证

背景 在需要进行表单认证的Asp.NET 5 MVC项目被创建后,往往需要根据项目的实际需求做一系列的工作对MVC 5内建的身份验证机制(Asp.NET Identity)进行扩展和定制: Asp.NET内建的身份验证机制会使用Local DB(本地数据库)读写用户相关的信息,而在数据库驱动的项目中,管理业务信息的数据库通常是特定的数据库环境,比如远程SQL Server数据库实例或Access数据库等等,业务数据库中保存着一系列针对业务需求的数据表,因此需要定制MVC 5内建身份验证,使其操作

Webservice学习之——即时发布与定制发布

一.工具 myEclipse tomcat  6.0 以上版本 axis-bin-1_4.zip 二.即时发布 1.解压 axis-bin-1_4.zip 2.axis-bin-1_4.zip\axis-1_4\webapps\axis     把axis发布到tomcat服务器下,及拷贝到webapps目录下 axis 为列子项目 3.启动tomcat,访问如下即发布sucess List 就是发布的接口位置. 5.编写java 代码,,提供方法.如下 把HelloWs.java 文件,.ja

Unity3D引擎扩展中的编辑器定制方法

http://gamerboom.com/archives/36432 作者:Richard Fine Unity3D的方便之处在于,它很容易地扩展编辑器套件.每款游戏都对加工有着不同的需求,可以快速地以完全集成的方法来构建这些内容并极大地提升开发速度. 目前有大量复杂的软件包提供以基本Unity功能套件为基础的复杂工具,从视觉脚本编辑器到编辑器内导航网格生成.但是,有关如何自行构建此类事物的程序说明却很少.我将在下文列举某些在自己的工作中总结的编辑器定制相关信息. Unity-Window(f

C#如何定制Excel界面并实现与数据库交互

Excel是微软办公套装软件的一个重要的组成部分,它可以进行各种数据的处理.统计分析和辅助决策操作,广泛地应用于管理.统计财经.金融等众多领域.(另外,Excel还是伦敦一所会展中心的名称)..NET可以创建Excel Add-In对Excel进行功能扩展,这些扩展的功能包括自定义用户函数,自定义UI,与数据库进行数据交互等. 一 主要的Excel开发方式 1 VBA  VBA是一种Visual Basic的宏语言,它是最早的Office提供定制化的一种解决方案,VBA是VB的一个子集,和Vis