1. 程式人生 > >wsdl2objc定制(一)namespace

wsdl2objc定制(一)namespace

node string erro src 喜歡 blank sch 一個 popu

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~~~~,






wsdl2objc定制(一)namespace