接続する必要のある.NETWebサービスがありますが、残念ながらWebサービスを変更できません。NSURLConnectionを使用してWebサービス呼び出しを作成しましたが、正常に応答が返されます。
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];
}
10回のうち1回は、すべてが正常に処理されます。ただし、10回のうち9回は、TBXMLライブラリのchildElementNamed関数にEXC_BAD_ACCESSをスローします。それがチョークするXMLの部分は可変です。60%の確率で、これは1つの特定の要素です。40%の確率で、他の要素のランダムな組み合わせです。
ラッパーオブジェクトをロードした後、TBXMLElement*childObject定義で例外が発生します。childElementNamed:メソッドでは、aParentXMLElementがnullであるため、ラッパーオブジェクトに問題があると確信しています。ただし、データはパーサーが期待するとおりにXMLファイルに存在し、場合によっては機能します。そして、私が取り戻すデータは常に同じです。
これを診断するのに何か助けはありますか?道に迷いました...