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

时间:2011-08-11 23:00:07

标签: iphone xml ios ipad tbxml

我有一个我必须连接的.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为null。但是,数据存在于XML文件中,正如解析器所期望的那样,并且它有时会起作用。我收到的数据总是一样的。

任何帮助诊断这个?我迷路了...

2 个答案:

答案 0 :(得分:1)

该问题原来是一个XML问题。 TBXML库正在读取的数据有一些特殊字符,特别是&amp ;.为了解决这个问题,我使用NSData对象,将其转换为字符串,使用Google的字符转义类对UNescape进行解除,并将其重写为NSData对象。我可以在那时解析字符串,但我已经为NSData设置了解析器,所以我现在就保持这种方式。

答案 1 :(得分:0)

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

How to access SOAP services from iPhone

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