2011-08-11 40 views
1

我有一個需要連接的.NET Web服務,不幸的是,我無法更改Web服務。我使用NSURLConnection構建了Web服務調用,並且我收到了響應罰款。使用TBXML處理XML數據時出現問題

我把我從Web服務調用收到的NSData對象,當調用connectionDidFinishLoading方法時,我正在將數據寫入文件。這也很好,沒有問題。

我把文件路徑加載到TBXML類中。當我嘗試通過initWithXMLFile加載它時,它實際上從不會從文件返回數據。我加載文件到一個NSData對象,並使用initWithXMLData和東西加載罰款。

當我實際處理文件時,會發生問題。首先,我得到根元素,然後解析出額外的SOAP頭。當我進入我的數據的嵌套部分時,我設置了循環來處理它們。

TBXMLElement *root = parser.rootXMLElement; 
if (root) { 
    TBXMLElement *soapBody = [TBXMLElement childElementNamed:@"soap:Body" parentElement:root]; 
    TBXMLResponse *serviceResponse = [TBXMLElement childElementNamed:@"GetServiceResponse" parentElement:soapBody]; 
    ... more code like this ... 
    TBXMLElement *mainObject = [TBXML childElementNamed:kMainObject parentElement:parentObject]; 
    while (mainObject != nil) { 
     TBXMLElement *element1 = [TBXML childElementName:kElement1 parentElement:mainObject]; 
     object.value1 = [TBXML textForElement:element1]; 
     ... more nesting and value getting like this ... 
     mainObject = [TBXML nextSiblingName:kMainObject searchFromElement:mainObject]; 
    } 
} 

這裏是我的數據會怎樣看:

< ... soap stuff ... > 
<mainObject> 
    <element> ... </element> 
    <element> ... </element> 
    <element> ... </element> 
    <childObjects> 
     <childObject> ... </childObject> 
     <childObject> ... </childObject> 
     <childObject> ... </childObject> 
    </childObject> 
</mainObject> 

因此,要處理周圍的childObject元素包裝(標籤),我只是拔出childObjects元素,然後建立了一個循環嵌套在該元素中的所有東西。像:

// Go into the childObjects wrapper 
TBXMLElement *childObjectsWrapper = [TBXML childElementNamed:kChildObjectsWrapper parentElement:parent]; 
// Get the first childObject element 
TBXMLElement *childObject = [TBXML childElementNamed:kChildObject parentElement:parent]; 
while (childObject != nil) { 
    ... process the nested elements ... 

    childObject = [TBXML nextSiblingNamed:kChildObject searchFromElement:childObject]; 
} 

1次超過10,一切進程都很好。但是,10次中的9次,它會在TBXML庫的childElementNamed函數中引發EXC_BAD_ACCESS。它扼殺的XML部分是可變的。 60%的時間,這是一個特定的元素。 40%的時間是隨機分配的其他元素。

加載包裝器對象後,異常在TBXMLElement * childObject定義處擊中。我確定它是包裝對象的東西,因爲在childElementNamed:方法中,aParentXMLElement爲null。但是,數據存在於XML文件中,正如解析器期望的那樣,並且它有時可以工作。我回來的數據總是一樣的。

任何幫助診斷?我迷路了......

回答

1

問題原來是一個XML問題。 TBXML庫正在讀取的數據有一些轉義的特殊字符,特別是&。爲了解決這個問題,我使用NSData對象,將其轉換爲字符串,使用Google的字符轉義類來取代&,並將其重寫爲NSData對象。我可以在那個時候解析字符串,但是我已經爲NSData設置瞭解析器,所以我現在保持這種狀態。

0

你有沒有考慮切換到使用一些標準的SOAP庫的Objective-C:

How to access SOAP services from iPhone

要容易得多的是從頭開始編寫自己的SOAP處理程序。

+0

是的,但這不是問題的原因。 SOAP代碼工作正常,寫入文件就好了。問題在於解析。 – DKS

+0

使用SOAP的全部難點在於解析SOAP信封併爲請求放置合適的SOAP封裝......我的擔心是,如果您從一開始就看到問題解析,那麼您的道路上會有更多問題您... –