0

接続する必要のある.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ファイルに存在し、場合によっては機能します。そして、私が取り戻すデータは常に同じです。

これを診断するのに何か助けはありますか?道に迷いました...

4

2 に答える 2

0

Objective-C 用の標準 SOAP ライブラリを使用するように切り替えることを検討しましたか:

iPhone から SOAP サービスにアクセスする方法

独自の SOAP ハンドラーをゼロから作成するよりもはるかに簡単です。

于 2011-08-11T23:20:49.917 に答える
0

問題は XML の問題であることが判明しました。TBXML ライブラリによって読み取られていたデータには、エスケープされた特殊文字 (特に & など) が含まれていました。これを修正するには、NSData オブジェクトを取得して文字列に変換し、Google の文字エスケープ クラスを使用して & を UNescape し、NSData オブジェクトに書き換えます。その時点で文字列を解析することもできましたが、すでに NSData 用にパーサーをセットアップしていたので、今のところそのままにしておきます。

于 2011-08-16T16:54:35.110 に答える