Iphone 使用TBXML处理XML数据时出现问题

Iphone 使用TBXML处理XML数据时出现问题,iphone,xml,ios,ipad,tbxml,Iphone,Xml,Ios,Ipad,Tbxml,我必须连接一个.NET web服务,不幸的是,我无法更改web服务。我使用NSURLConnection构建了web服务调用,收到了良好的响应 我从web服务调用接收NSData对象,当调用ConnectiondFinishLoading方法时,我将数据写入文件。这也很有效,没有问题 我获取文件路径并将其加载到TBXML类中。当我试图通过initWithXMLFile加载它时,它实际上从未从该文件返回数据。我将文件加载到一个NSData对象中,并使用initWithXMLData,这样就可以很好

我必须连接一个.NET web服务,不幸的是,我无法更改web服务。我使用NSURLConnection构建了web服务调用,收到了良好的响应

我从web服务调用接收NSData对象,当调用ConnectiondFinishLoading方法时,我将数据写入文件。这也很有效,没有问题

我获取文件路径并将其加载到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>
10次中有1次,所有过程都很顺利。但是,10次中有9次,它会在TBXML库中的childElementNamed函数中抛出EXC_BAD_访问。它阻塞的XML部分是可变的。60%的时候,这是一种特殊的元素。40%的情况下,它是其他元素的随机组合

加载包装器对象后,异常会出现在TBXMLElement*childObject定义上。我确信这与包装器对象有关,因为在childElementNamed:方法中,aParentXMLElement为null。但是,数据按照解析器的预期存在于XML文件中,并且有时可以工作。我得到的数据总是一样的


能帮我诊断一下吗?我迷路了…

您是否考虑过为Objective-C使用一些标准SOAP库:


从头开始编写自己的SOAP处理程序要容易得多。

这个问题原来是XML问题。TBXML库读取的数据有一些转义的特殊字符,特别是&。为了修复它,我获取NSData对象,将其转换为字符串,使用Google的字符转义类来取消&,并将其重写为NSData对象。我可以在那个时候解析字符串,但我已经为NSData设置了解析器,所以我现在一直保持这种方式。

是的,但这并不是问题的真正原因。SOAP代码运行良好,并且可以很好地编写文件。问题在于解析。使用SOAP的全部困难在于解析SOAP信封并为请求组合正确的SOAP包装。。。我担心的是,如果您从一开始就看到一个问题,那么您将面临更多问题。。。
// 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];
}