我有一个必须连接的 .NET Web 服务,不幸的是,我无法更改该 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% 的时间,它是一个特定的元素。40% 的时间是其他元素的随机组合。
在加载包装对象后,异常在 TBXMLElement *childObject 定义处发生。我确定它与包装对象有关,因为在 childElementNamed: 方法中,aParentXMLElement 为空。但是,正如解析器所期望的那样,数据在 XML 文件中,并且有时可以工作。我得到的数据总是一样的。
任何帮助诊断这个?我迷路了...