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,再点击,再点击最下面的绿色按钮,这里默认大家都有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-10 12:12:24

wsdl2objc namespace 自定义的相关文章

自定义窗体的最大化,最小化,关闭功能

namespace 自定义窗体的最大化_最小化和关闭按钮 { partial class Form1 { /// <summary> /// 必需的设计器变量. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清理所有正在使用的资源. /// </summary> /// <param name="disp

.Net——使用.net内置处理程序处理自定义节点Demo

在.net中,因为对不同的节点,都对应着类去对它进行处理,.net里面为了方便,已经内置了一些类供我们使用,使我们在读取配置文件时,不必自己去定义类去处理自己定义的自定义节点. 下面我们写了这样一个配置文件: <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <!--使用IgnoreSection处理自定义节点--> <

自定义水晶按钮控件

namespace 自定义水晶按钮控件 { partial class Form1 { /// <summary> /// 必需的设计器变量. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清理所有正在使用的资源. /// </summary> /// <param name="disposing&quo

C#编程(七十一)---------- 自定义特性

自定义特性 在说自定义之前,有必要先介绍一些基本的概念. 元数据:就是C#中封装的一些类,无法修改,类成员的特性被称为元数据中的注释 1.什么是特性? (1)属性和特性的区别 属性:属性是面向对象思想里所说的封装在类里面的数据字段,Get,Set方法. 特性:就相当于类的元数据. 来看看官方解释? 特性是给指定的某一声明的一则附加的声明性信息. 允许类似关键字的描述声明.它对程序中的元素进行标注,如类型.字段.方法.属性等.从.net角度看,特性是一种 类,这些类继承于System.Attrib

c#自定义类型的转换方式operator,以及implicit(隐式)和explicit (显示)声明的区别

msdn参考:http://msdn.microsoft.com/zh-cn/library/s53ehcz3.aspx http://msdn.microsoft.com/zh-cn/library/z5z9kes2.aspx http://msdn.microsoft.com/zh-cn/library/xhbhezf4.aspx operator 关键字来重载内置运算符,或提供类或结构声明中的用户定义转换.它可以定义不同类型之间采用何种转化方式和转化的结果. operator用于定义类型转

[转] 自定义事件

DebugLZQ 原文.NET自定义事件小结 关于事件各位应该都不陌生,相信每个程序员都可以拍着胸脯说“事件?我知道啊~”,可如何自定义事件?也许有人心中就不是那么底气十足了. 用很多地方都被引用到泛滥的一个例子来写吧,始作俑者就不去深究了.描述是这样的:小偷进入时,事件发送者(狗)发送狗叫事件(自定义),(事件接收者)主人订阅狗叫事件并处理(抓住小偷),事件的参数传递的是小偷的数量.下面就给出实现的具体步骤---已经在代码注释中标明,以供各位博友抽象出自定义事件的流程. using Syste

在struts2中配置自定义拦截器放行多个方法

源码: 自定义的拦截器类: //自定义拦截器类:LoginInterceptor ; package com.java.action.interceptor; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.inte

【转】Xml序列化

XML序列化是将对象的公共属性和字段转换为XML格式,以便存储或传输的过程.反序列化则是从XML输出中重新创建原始状态的对象.XML序列化中最主要的类是XmlSerializer类.它的最重要的方法是Serialize和Deserialize方法,它位于System.Xml.Serialization命名空间. 一.XML序列化基本要点 在本节开始之前,首先来看一个最简单的示例: namespace 学习测试 { class Program { static void Main(string[]

C#编程(五十一)----------链表

原文链接: http://blog.csdn.net/shanyongxu/article/details/47024865 链表 LinkedList<T>集合类没有非泛型类的版本,它是一个双向链表,他的元素指向元素的前一个与后一个元素. 链表的有点事:如果要插入一个元素到链表的中间位置,效率很高,因为如果插入一个元素,只需要修改上一个元素的Next与下一个元素的Previous的引用即可. 链表的缺点是,链表只能是一个接着一个访问,这样就要用更长的时间来查找定位位于链表中间的元素. Lin