wsdl2objc定制(一)namespace
阿新 • • 發佈:2017-05-21
node string erro src 喜歡 blank sch 一個 popu
意外的元素,這什麽東西嘛!
1、蠢辦法。(以下還有聰明的辦法哦!)找到自己要調用的webservice方法的相應的設置參數的方法。例如以下:
把上面的xxxxService參數改為nil。改完後例如以下
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執行。 再又一次生成一下看看
把app文件考出來。分給成家班用,duang~~~~,
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、解決的方法:
- (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