我有一個需要連接的.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文件中,正如解析器期望的那樣,並且它有時可以工作。我回來的數據總是一樣的。
任何幫助診斷?我迷路了......
是的,但這不是問題的原因。 SOAP代碼工作正常,寫入文件就好了。問題在於解析。 – DKS
使用SOAP的全部難點在於解析SOAP信封併爲請求放置合適的SOAP封裝......我的擔心是,如果您從一開始就看到問題解析,那麼您的道路上會有更多問題您... –